Scraper выдает ошибку, даже если используется правильный xpath - PullRequest
0 голосов
/ 01 июня 2018

Я написал скрипт на python в сочетании с библиотекой lxml для анализа некоторых price (в данном случае 80 и 100) из фрагмента html elements.Я использовал xpaths, чтобы сделать работу.Когда я использую .fromstring(), тогда оба xpaths, которые я использовал в своем нижнем скребке, работают без сбоев.Однако, когда я выбираю импортировать HTML из lxml.etree, выражение xpath Содержит contains() завершается неудачно.Оказывается, что когда я использую несколько class имен внутри скребка, он работает, но когда выбираю single class name из compound class names, выдается ошибка.

Как мне справиться с такой ситуацией, не используя compound class names; скорее, используя single class name следующий .contains() шаблон или что-то еще?

Это моя попытка:

from lxml.etree import HTML

elements =\
"""
    <li class="ProductPrice">
      <span class="Regular Price">80.00</span>
    </li>
    <li class="ProductPrice">
      <span class="Regular Price">100.00</span>
    </li>
"""
root = HTML(elements)
for item in root.findall(".//*[@class='ProductPrice']"):
    # regular = item.find('.//span[@class="Regular Price"]').text
    regular = item.find('.//span[contains(@class,"Regular")]').text
    print(regular)

Кстати, закомментированный xpath, используемый в приведенном выше сценарииработает нормально.Но я не могу найти выражение .contains(), которое выдает следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\SO.py", line 15, in <module>
    regular = item.find('.//span[contains(@class,"Regular")]').text
  File "src\lxml\etree.pyx", line 1526, in lxml.etree._Element.find
  File "src\lxml\_elementpath.py", line 311, in lxml._elementpath.find
  File "src\lxml\_elementpath.py", line 300, in lxml._elementpath.iterfind
  File "src\lxml\_elementpath.py", line 283, in lxml._elementpath._build_path_iterator
  File "src\lxml\_elementpath.py", line 229, in lxml._elementpath.prepare_predicate
SyntaxError: invalid predicate

И последнее: я не хочу использовать compound class names, потому что немногие веб-сайты производят их динамически.Спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

.find() поддерживает только базовый xpath.

Попробуйте вместо .xpath().

Пример (не проверено) ...

regular = item.xpath('.//span[contains(@class,"Regular")]')[0].text 

Подробнее см. http://lxml.de/xpathxslt.html.

...