我的文件中填充了包含在格式良好的XML中的句子(xmllint和tidylib都这样说)。 所以xml看起来像这样:
<a id="100" attr1="text" attr1="text" attr1="text">
<tagname id="1">
This is my sentence.
</tagname>
</a>
<a id="101" attr1="text" attr1="text" attr1="text">
<tagname id="1">
This is my sentence.
</tagname>
</a>
等等。
我使用以下代码提取具有属性的句子(在这种情况下从id 1到85)
a1 = open(r"file.xml",'r')
a = a1.readlines()
a1.close()
soup = BeautifulSoup(str(a))
for i in range(1,85):
a = soup.find('a', {'id': i})
achild = a.find('tagname')
tagnametext = achild.contents
print tagnametext
一切都打印得很好,直到第84句,我收到错误: achild = a.find('tagname') AttributeError:'NoneType'对象没有属性'find'
每一组......都是用for循环生成的,所以xml都是一样的。 我尝试过使用不同数量句子的不同文件。发生错误的id也会发生变化。 这是beautifulsoup的限制吗? 它无法扫描超过一定数量的行?
答案 0 :(得分:0)
最后一行失败了。它可能是文件编码问题,该行包含一些有趣的EOF字符,或者该行不被解释为字符串。你可以在失败之前打印出最后一行,看看它是什么类型的吗?
答案 1 :(得分:0)
a = soup.find('a', {'id': i})
84
很可能无法返回您期望的内容。如果找不到标记,则find()
会返回None
,从而解释AttributeError
此外,在您的代码中,您似乎是BeautifulSouping一个列表(表示为字符串)。
soup = BeautifulSoup(str(a))
你正在串起一个列表,然后把列表搞定,这很愚蠢。如果汤有整个文件,然后循环遍历每个标记,如果它有id
?
from bs4 import BeautifulSoup
with open('file.xml', 'r') as myfile:
soup = BeautifulSoup(myfile.read())
for i in soup.find_all('a', id=True):
print i.tagname.contents
打印:
[u'\nThis is my sentence.\n']
[u'\nThis is my sentence.\n']