【发布时间】:2010-08-12 11:39:22
【问题描述】:
今天我尝试了 lxml,因为我从特定的 web 服务中得到了非常讨厌的 html 输出,我不想使用 re 模块,只是为了改变和学习新的东西。我做到了,同时浏览 http://codespeak.net/lxml/ 和 http://stackoverflow.com
我不会尝试解释上面的 html 模板,但只是为了概述它充满了故意嵌套的表格。
我使用 html 解析器提取了部分感兴趣的内容,然后使用 find_class() 并使用 xpath 遍历 TR(甚至这个 TR 内部也有表格)。 现在我正在尝试根据类和 id 属性提取数据对:
- name child 有类“title”
- 值孩子的 ID 为“文本”
代码如下所示:
fragment = root.find_class('foo')
for node in fragment[0].xpath('table[2]/tr'):
name = node.xpath('//div[@id="title"]')
value = node.xpath('//td[@class="text"]')
问题是,并非我正在迭代的每个 TR 都有这些对:有些只有名称(id “title”),所以后来当我尝试压缩它们时,我得到了错误配对的数据。
我尝试了一些我想到的事情,但没有成功:我尝试比较列表长度(对于名称和值),如果它们不匹配跳过名称查找,那么如果它们不匹配,则删除最后一个列表项(在很多方面),但没有任何效果。例如:
if not len(name) == len(value):
name.pop()
或
if len(name) == len(value):
name = node.xpath('//div[@id="title"]')
value = node.xpath('//td[@class="text"]')
一些经验丰富的cmets?
【问题讨论】:
-
您正在解析的样本可能会有所帮助
-
我已经删除了我的答案,因为你显然不知道你在问什么。我建议的表达式返回的值与您问题中的表达式返回的值相同。
-
我在这里上传了稍微修改的示例:pastebin.com/cg5HHJ6x - 这是迭代的 TR。 @Dimitre Novatchev:如果您认为是这样,请返回您的答案并讨论它 - 1. 它有语法错误和 2. 它不起作用。如果你不能支持它,我认为你不应该试图提供答案
-
收到您的样品。现在你想从样本中提取什么?
-
我想配对子元素和
子元素,它们位于主 分支内(已发布示例中有 13 个,尽管它们在现实中有所不同)。并非每个主要的 元素都具有两者,有些则两者都没有。例如:第一个 元素没有任何元素,第二个 元素只有 并且第三个元素具有有效对。