发现问题
有如下实例代码:
from bs4 import BeautifulSoup
test="""<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Test</title>
</head>
<body>
<table>
<tbody>
<tr>
<td>
<div>
<b>
Icon
</b>
</div>
</td>
</tr>
</tbody>
</table>
</body>
</html>"""
soup = BeautifulSoup(test, 'html.parser')
rows = soup.findAll('tr')
for r in rows:
print(r.name)
for c in r.children:
print('>', c.name)
有如下输出:
tr
> None
> td
> None
我们观察到出现了原HTML文档中不存在的元素,这是什么原因呢?
分析原因
这是因为.children 可以是NavigableStrings 也可以是Tag 类型,在我的例子中,他是tr 标签前后的空白。 设计实验如下:
rows = soup.find_all('tr')
for r in rows:
print("row:", r.name)
for c in r.children:
print('----')
print(type(c))
print(repr(c))
会有如下输出:
row: tr
----
<class 'bs4.element.NavigableString'>
'\n'
----
<class 'bs4.element.Tag'>
<td>
<div>
<b>
Icon
</b>
</div>
</td>
----
<class 'bs4.element.NavigableString'>
'\n'
解决办法:
加一个判断,使其类型为想要的类型就好了:
soup = BeautifulSoup(test2, 'html.parser')
rows = soup.find_all('tr')
for r in rows:
print("row:", r.name)
for c in r.children:
if isinstance(c, bs4.element.Tag):
print('>', c.name)
输出结果如下:
row: tr
> td
|