我收到以下错误:
Traceback (most recent call last):
File "2.py", line 22, in <module>
i.string.replace_with(i.string.replace(u'\xa0', '-'))
AttributeError: 'NoneType' object has no attribute 'replace_with'
部分代码
soup = bs4(open("test.html"))
table = soup.find("table", {"color":"#fff"})
for i in soup.find_all('small'):
i.string.replace_with(i.string.replace(u'\xa0', '-')) <--Line 22
它昨天正常工作,但我不得不在另一台虚拟机上重新安装Mint,而我无法让它再次运行。我该如何解决这个问题?
编辑:这是所有代码:
from bs4 import BeautifulSoup as bs4
soup = bs4(open("test.html"))
table = soup.find("table", {"color":"#fff"})
for i in soup.find_all('small'):
i.string.replace_with(i.string.replace(u'\xa0', '-'))
#print soup
f = open("new.html", "w")
f.write(str(table))
这是test.html中的表格:
<table color="#fff">
<tr>
<td><small><small> </small></small></td>
</tr>
</table>
答案 0 :(得分:3)
根据documentation,.string
属性可以返回None
,如果标记&#34;包含多个内容&#34; 。< / p>
这仅表示列表中的一个元素(soup.find_all('small')
)是非叶元素。例如:
<small>Hello <em>Bobby</em></small>
对于这样的元素,.string
返回None
,因为它包含其他元素,并且未定义行为。
您的代码无法正常运行,因为您无法运行None.replace(u'\xa0', '-')
。
您需要做的是,在循环内部,测试迭代元素是否具有已定义的.string
成员。
for i in soup.find_all('small'):
if i.string :
i.string.replace_with(i.string.replace(u'\xa0', '-'))
注意:这是一个肮脏的解决方法,如果你有
它就不会工作 <small>  <tag>something unrelated</tag></small>