3

我正在努力提高我对 XPATH 的理解。我有一个包含许多元素的文档。我正在寻找文档中包含一些加粗的特定文本的字体元素。

这是 div 元素中的字体元素的示例。字体元素具有我想要捕获的粗体文本

<div style="line-height:120%;padding-bottom:10px;padding-top:10px;font-size:10pt;"><font style="font-family:inherit;font-size:10pt;font-weight:bold;">SECTION 1.&nbsp;&nbsp;&nbsp;&nbsp;Executive&nbsp;Summary</font></div>

让我明确一点,这是一个更大的文件的一部分。我找到了一个 XPATH 教程,它描述了如何选择特定元素

只是为了确保我没有遇到我如何阅读文件的问题

tree=html.fromstring(open('c:\\mytest.htm')

x=tree.xpath('//font') 

这是因为 x 有 3023 个元素,当我检查它们时,我发现它们都是字体元素。有些是我想要的元素。

然后我尝试通过使用来隔离相关元素

my_elements = tree.xpath('//font[@font-weight='bold']')

这不起作用,因为 my_elements 是空的。在写这个问题时,我仔细查看了 html 的片段,并在 IDLE 中玩了一些。我认为问题在于我没有字体标签字体粗细的属性。字体粗细与样式属性有关。本例中字体标签的唯一属性是样式。想多说,又怕把水搅得太多

底线我希望能够使用 xpath 来查找所有粗体字体元素并在文本中包含单词部分我可以通过迭代元素并以非常笨重的方式进行测试来做到这一点

my_elements = [e for e in tree.iter() if e.tag == 'font' if 'bold' in e.values()[0] ]
my_elements = e for e in my_elements if 'section' in e.text_content().lower()

XPATH 看起来很值得理解。

感谢您的任何解释。

嗯,我终于走上了正轨

testelem=tree.xpath('//font[contains(@style,"font-weight:bold")]')

好的,现在我们使用 and 运算符

testelem=tree.xpath('//font[contains(@style,"font-weight:bold") and contains(text(),"SECTION")]')

现在使它不区分大小写

我正在接近理解 contains 的工作原理,但我很高兴有人提出解决方案

testelem=tree.xpath('//font[contains(@style,"font-weight:bold") and starts-with(translate(text(),"SECTION","section"),"section")]')
4

1 回答 1

3

只要意识到这篇文章就像 > 2 岁,无论如何我仍然希望这个答案能帮助遇到这个问题的人。

您可以在lxml的 xpath中使用正则表达式。默认情况下,XPath 支持EXSLT命名空间中的正则表达式:

testelem = tree.xpath('//font[re:match(text(), \
                      "^(?i)section.*") and \
                      contains(@style, "font-weight:bold")]',
                      namespaces={'re': "http://exslt.org/regular-expressions"})

print testelem
[<Element font at 0x1042f49f0>]

for t in testelem:
    print t.text, t.attrib

SECTION 1.    Executive Summary {'style': 'font-family:inherit;font-size:10pt;font-weight:bold;'}
于 2015-02-01T17:50:24.597 回答