Получить html-тег с частичной строкой, используя xpath - PullRequest
3 голосов
/ 03 января 2012

HTML-код является слепым и содержит строку "PRICE" в html. Эта частичная строка должна соответствовать html-тексту. Если текст соответствует (частичное совпадение) с использованием xpath. Он должен возвращать конкретный путь тега 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?

Мне просто нужно получить путь к классу div с помощью выражения xpath.

Также проблема в том, что если я найду строку "PRICE:". Мне нужно получить родительский действительный тег , который является "div" с именем класса "price_class". но здесь я должен пропустить или удалить ненужные теги , такие как шрифт, жирный, курсив ...

Не могли бы вы предложить мне получить родительский допустимый тег для найденной строки?

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Вы можете использовать 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]')
0 голосов
/ 03 января 2012

Мне просто нужно получить путь к классу div с помощью выражения xpath.

Использовать :

//*[contains(text(), 'PRICE')]/ancestor::div[1]/@class

Такжепроблема в том, что если я найду строку "PRICE:"Я должен получить родительский допустимый тег "div" с именем класса "price_class".но здесь я должен пропустить или удалить ненужные теги, такие как шрифт, полужирный, курсив ...

XPath - это язык запросов для документов XML.Как таковой он не может изменить структуру XML-документа.Для этого необходимо использовать другой язык (на котором размещается XPath).

XSLT является наиболее подходящим языком для выполнения преобразования XML-документа, поскольку он был специально разработан для этой цели.

...