使用XPath提取部分匹配的HTML标签字符串
这个html代码是盲目的,它里面有一个字符串“PRICE”。我们需要找到这个字符串在html文本中的位置。如果找到了(部分匹配),就要用xpath返回这个特定的html标签路径。
注意:我需要把这个逻辑自动化,适用于多个网站。我需要使用通用规则(用于定位“价格”,获取父标签)。
下面是一个例子:
html="""<div id = "price_id">
<span id = "id1"></span>
<div class="price_class">
<bold>
<strong>
<label>PRICE:</label> 125 Rs.
</bold>
</strong>
</br>
</br>
</div>"""
我使用了lxml。
from lxml.html.clean import Cleaner
cleaner =Cleaner(page_structure=False)
cl = cleaner.clean_html(html)
cleaned_html = fromstring(cl)
for element in cleaned_html:
if element.text == 'PRICE':
print "matched"
那用Xpath表达式该怎么写呢?
我只需要用xpath表达式获取div类的路径。
还有一个问题是,如果我找到了“PRICE:”这个字符串,我需要获取它的父有效标签,也就是类名为“price_class”的“div”。但是我需要跳过或移除一些不需要的标签,比如font、bold、italic等。
你能帮我建议一下如何获取这个定位字符串的父有效标签吗?
2 个回答
0
我只需要通过xpath表达式获取div类的路径。
使用:
//*[contains(text(), 'PRICE')]/ancestor::div[1]/@class
还有一个问题是,如果我定位到“PRICE:”这个字符串,我需要获取它的父标签,也就是类名为“price_class”的“div”标签。但在这里,我需要跳过或去掉一些不需要的标签,比如font、bold、italic等。
XPath是一种用于查询XML文档的语言。它不能改变XML文档的结构。如果想要修改,就需要用到其他语言(也就是运行XPath的语言)。
XSLT是最合适的语言,用于对XML文档进行转换,因为它就是为了这个目的而特别设计的。
5
你可以使用 ancestor
轴:
import lxml.html
html = ...
doc = lxml.html.fromstring(html)
for element in doc.xpath('//label[contains(text(), "PRICE:")]/ancestor::div[@class="price_class"]'):
print 'Found %s: %s' % (element.tag, element.text_content().strip())
输出结果:
Found div: PRICE: 125 Rs.
编辑: 针对修改后的问题提供更通用的解决方案:
doc.xpath('//*[contains(text(), "PRICE:")]/\
ancestor::*[not(self::strong|self::bold|self::italic)][1]')
这个方法会查找包含文本 "PRICE:
" 的元素,然后选择第一个祖先元素,同时跳过 strong
、bold
和 italic
这些标签。你可以在排除列表中添加更多的标签。
除了排除列表,你还可以查找第一个合适的祖先元素(比如 div
、ul
等):
doc.xpath('//*[contains(text(), "PRICE:")]/ancestor::*[self::div|self::ul][1]')