我正在努力提高我对 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. Executive 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/