python - 如何在 LXML 中使用 XPATH 根据属性指定特定元素

标签 python html lxml

我正在努力提高我对 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 中玩了一些。我认为问题是我没有字体标签 font-weight 的属性。 Font-weight 是和 style 属性相关的东西。这个例子中 font 标签的唯一属性是 style。想多说又怕把水搅浑

最重要的是,我希望能够使用 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")]')

最佳答案

才意识到这个帖子已经超过 2 年了,无论如何我仍然希望这个答案能对遇到这个问题的人有所帮助。

您可以使用 regular expression在来自 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;'}

关于python - 如何在 LXML 中使用 XPATH 根据属性指定特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13982270/

相关文章:

python - lxml 属性顺序

Python 删除某些文件扩展名

javascript - Jquery UI - 在一个 DIV 到另一个 Div 之间可排序,在 DIV 内不可排序

html - UIWeb View : css ignored

python - 如何使用 Python 的 lxml.objectify 创建非嵌套的 xml 元素?

python - 如何使用 Xpath 抓取 NHL 溜冰者统计数据?

python - 使用生成器生成 (p,1-p) 对

python - 为什么 `__new__` 返回的对象是可变的,即使对于不可变的基类也是如此?

python - 如何在监听所有设备上的网络流量时识别数据包的接口(interface)?

html - 为什么 CSS 径向渐变在 Edge 中不起作用?