Почему селектор Scrapy приносит только родительский элемент? - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь настроить селектор Scrapy для извлечения некоторых данных из таблицы со страницы поддерживаемых монет Trezor (https://trezor.io/coins/):

In [1]: import requests
   ...: from scrapy.selector import Selector
   ...: req = requests.get('https://trezor.io/coins/').content
   ...: xs = '//*[@id="content"]/tr'
   ...: sel = Selector(text=req).xpath(xs)

In [2]: sel.extract_first()
Out[2]: '<tr class="coin  " data-href="./#BTC" id="BTC"></tr>'

Не должен ли селектор приносить элемент tr и все, что внутри него (в данном случае шесть элементов td с большим количеством внутренних элементов? Когда я пытаюсь получить доступ к элементам td вручную (с помощью xs = '//*[@id="content"]/tr[1]/td' или xs = '//*[@id="content"]/tr[1]/td[1]'), все Я получаю пустой список. Я также пытался получить дочерние узлы , но безрезультатно.

Cf. извлечение на main в Википедии страница, на которой вы получаете все внутри указанного контейнера:

In [3]: req2 = requests.get('https://en.wikipedia.org/wiki/Main_Page').content
   ...: xd = '//*[@id="mp-welcomecount"]'
   ...: sel2 = Selector(text=req2).xpath(xd)

In [4]: sel2.extract_first()
Out[4]: '<div id="mp-welcomecount">\n<div id="mp-welcome">Welcome to <a href="/wiki/Wikipedia" title="Wikipedia">Wikipedia</a>,</div>\n<div id="mp-free">the <a href="/wiki/Free_content" title="Free content">free</a> <a href="/wiki/Encyclopedia" title="Encyclopedia">encyclopedia</a> that <a href="/wiki/Help:Introduction" title="Help:Introduction">anyone can edit</a>.</div>\n<div id="articlecount"><a href="/wiki/Special:Statistics" title="Special:Statistics">6,088,421</a> articles in <a href="/wiki/English_language" title="English language">English</a></div>\n</div>'

Почему в случае Trezor я получаю только элемент tr и как мне исправить свой код, чтобы вывести все, что в нем содержится?

1 Ответ

0 голосов
/ 30 мая 2020

Scrapy кажется немного неуместным, когда дело доходит до парсинга страницы (ошибка с закрывающим тегом tr). Между элементами tr и td нет связи "родитель-потомок". У вас есть только братья и сестры. Структура проанализированной страницы:

tr
td
 span
  img
td
 strong
 small
 a
td
 img
td
 img
td
 a
 a
 a
 a
td
 a
 a
tr
...

Возможно, вы можете использовать следующее выражение XPath для извлечения всех данных из таблицы:

//tr[contains(@class,"coin")][1]/following-sibling::td

Вывод: 8364 узла

Или поищите опцию magi c в настройках scrapy.

...