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

Python 如何在LXML中使用XPATH根据属性指定特定元素,python,html,lxml,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;"

我正在努力提高对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>
这是因为x有3023个元素,当我检查它们时,我发现它们都是字体元素。有些是我想要的元素

然后,我尝试使用

my_elements = tree.xpath('//font[@font-weight='bold']')
这不起作用,因为my_元素为空。在写这个问题的时候,我更仔细地观察了html的片段,并在空闲的时候玩了一些。我想问题是我没有字体标签的字体权重属性。字体重量与样式属性有关,本例中字体标记的唯一属性是样式。我想多说几句,但恐怕我会把水弄得太浑浊了

总之,我希望能够使用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岁了,不管怎样,我还是希望这个答案能帮助回答这个问题的人

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

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;'}
testelem=tree.xpath('//font[re:match(text()\
“^(?i)节。*”)和\
包含(@style,“font-weight:bold”)],
名称空间={'re':“http://exslt.org/regular-expressions"})
打印测试仪
[]
对于测试仪中的t:
打印t.text,t.attrib
第一节。执行摘要{'style':'font-family:inherit;font-size:10pt;font-weight:bold;'}

您不应该在粗体周围省去引号吗
my_elements=tree.xpath('//font[@font-weight='bold']')
,这不是我在解释器中看到的,也不是我在其他地方看到的示例。我想你已经找到了答案。把它贴在下面好吗,这样我们就可以投票了?我还没有完全理解它,而且我还在努力想如果我写了答案,我希望它有一个清晰的解释,以便下一个提问者了解发生了什么。
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;'}