AttributeError:' NoneType'对象没有属性' replace_with'

时间:2014-09-08 10:13:45

标签: python python-2.7

我收到以下错误:

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>&nbsp;</small></small></td>
</tr>

</table>

1 个答案:

答案 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>&nbsp <tag>something unrelated</tag></small>