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”.
但在这里我应该跳过或删除不需要的标签,例如字体,粗体,斜体…
您能否建议我获取所定位字符串的父有效标签?
解决方法:
您可以使用祖先轴:
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:”的元素,然后选择第一个祖先,跳过强,粗体,斜体.您可以将更多标签添加到排除列表.
除了排除列表,您还可以搜索第一个好祖先(例如div,ul等):
doc.xpath('//*[contains(text(), "PRICE:")]/ancestor::*[self::div|self::ul][1]')