xml解析莫名其妙地终止了

时间:2013-06-13 09:57:20

标签: python xml beautifulsoup

我的文件中填充了包含在格式良好的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的限制吗? 它无法扫描超过一定数量的行?

2 个答案:

答案 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']