使用xpath获取部分匹配的html标签字符串

4

HTML代码是盲目的,其中包含“PRICE”字符串。必须使用xpath将部分字符串与HTML文本匹配。如果部分匹配,应该返回特定的HTML标签路径。

注意:我需要为多个网站自动化此逻辑。我应该使用通用规则(查找“Price”,获取父标记)

这是一个示例:

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个回答

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:”的元素,然后选择第一个祖先跳过strongbolditalic。您可以添加更多标签到排除列表中。
而不是使用排除列表,您可以搜索第一个好的祖先(如divul等):
doc.xpath('//*[contains(text(), "PRICE:")]/ancestor::*[self::div|self::ul][1]')

这里我看不到HTML源代码。因此,我无法手动使用属性和标签。对于另一个网站,标签和类会有所不同,对吧?我需要为许多网站自动化此逻辑。因此,在这里,我可以使用通用规则而不是提及(label、price_class)。 - Nava
@saravana,添加了更通用的解决方案来回答。 - reclosedev
谢谢朋友 :-) 我有一个疑问,我需要将text()的大小写转换为大写。我尝试了upper-case(text()),'price',但它没有起作用。 - Nava
@saravana,lxml支持XPath 1.0,而upper-case()则是XPath 2.0的函数。作为解决方法,您可以使用类似以下的代码:translate(text(), "abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ") - reclosedev

0
我只需要使用xpath表达式获取div类路径。
用途:
//*[contains(text(), 'PRICE')]/ancestor::div[1]/@class

此问题在于如何定位“PRICE:”字符串。我需要获取父级有效标签,即具有“price_class”类名的“div”。但是在这里,我需要跳过或删除不需要的标签,例如font、bold、italic等。
XPath是一种用于XML文档的查询语言。因此,它不能修改XML文档的结构。要做到这一点,必须使用另一种语言(即托管XPath的语言)。
XSLT是执行XML文档转换最合适的语言,因为它专门设计用于此目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接