Как извлечь список значения метки с помощью Scrapy, когда HTML-тег отсутствует

1

В настоящее время я обрабатываю документ с помощью

<b> label1 </b>
value1 <br>
<b> label2 </b>
value2 <br>
....

Я не могу понять чистый подход к xpath с помощью scrapy. вот моя лучшая реализация

hxs = HtmlXPathSelector(response)

section = hxs.select(..............)
values = section.select("text()[preceding-sibling::b/text()]"):
labels = section.select("text()/preceding-sibling::b/text()"):

но мне не нравится этот подход для сопоставления узлов обоих списков с помощью индекса. Я предпочел бы перебирать 1 список (значения или метки) и запрашивать соответствующие узлы как относительный xpath. Например:

values = section.select("text()[preceding-sibling::b/text()]"):
for value in values:
    value.select("/preceding-sibling::b/text()"):

Я настраивал это выражение, но всегда возвращаю никакие соответствия

UPDATE

Я ищу надежный метод, который будет терпеть "шум", например.

garbage1<br>
<b> label1 </b>
value1 <br>
<b> label2 </b>
value2 <br>
garbage2<br>
<b> label3 </b>
value3 <br>
<div>garbage3</div>
  • 1
    Так чего вы пытаетесь достичь?
  • 1
    найти надежный подход к сопоставлению метки и значений без риска несоответствия.
Теги:
xpath
scrapy

1 ответ

1

Изменить: извините, я использую lxml, но он будет работать так же с собственным селектором Scrapy.

Для конкретного HTML, который вы указали, будет работать:

>>> s = """<b> label1 </b>
... value1 <br>
... <b> label2 </b>
... value2 <br>
... """
>>> 
>>> import lxml.html
>>> lxml.html.fromstring(s)
<Element span at 0x10fdcadd0>
>>> soup = lxml.html.fromstring(s)
>>> soup.xpath("//text()")
[' label1 ', '\nvalue1 ', ' label2 ', '\nvalue2 ']
>>> res = soup.xpath("//text()")
>>> for i in xrange(0, len(res), 2):
...     print res[i:i+2]
... 
[' label1 ', '\nvalue1 ']
[' label2 ', '\nvalue2 ']
>>> 

Изменить 2:

>>> bs = etree.xpath("//text()[preceding-sibling::b/text()]")
>>> for b in bs:
...     if b.getparent().tag == "b":
...         print [b.getparent().text, b]
... 
[' label1 ', '\nvalue1 ']
[' label2 ', '\nvalue2 ']
[' label3 ', '\nvalue3 ']

Также для того, что стоит, если вы зацикливаете на выбранные элементы, которые вы хотите сделать "./foo" в вашем xpath внутри цикла for, а не "/foo".

  • 0
    эта реализация просто отличается от моей, но на самом деле не является более надежной. Смотрите обновление в вопросе.
  • 1
    Привет, смотрите редактировать .. это может помочь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню