Селектор XPath возвращает пустой список

#scrapy

#scrapy

Вопрос:

Я пытаюсь очистить данные из хранилища: https://www.tibia.com/charactertrade/?subtopic=currentcharactertradesamp;page=detailsamp;auctionid=12140amp;source=overview

Нет проблем с получением данных из 1-й и 2-й таблиц, но когда я отключаюсь, xpath возвращает только пустые списки.

даже пытался сохранить ответ в файле:

 scrapy fetch --nolog "https://www.tibia.com/charactertrade/?subtopic=currentcharactertradesamp;page=detailsamp;auctionid=3475amp;source=overview" > response.html
  

для таблицы с навыками все работает хорошо

 sword = response.xpath('//div [@class="AuctionHeader"]/a/text()').get()
  

но когда дело доходит до получения, например, значения gold, я получаю только пустой список:

 gold = response.xpath('/html/body/div[3]/div[1]/div[2]/div/div[2]/div/div[1]/div[2]/div[5]/div/div/div[3]/div[2]/div[2]/table/tbody/tr/td/div/table/tbody/tr[2]/td/div[2]/div/table/tbody/tr[3]/td/div/text()').get()
  

В Chrome / Firefox оба селектора работают гладко, но в scrapy только 1-й

Я знаю, что могут возникнуть некоторые проблемы с данными, обновленными javascript, но это не похоже на этот случай

Ответ №1:

Не похоже, что это проблема javascript. Думаю, вы неправильно используете свои селекторы XPATH. Лучше всего быть как можно более конкретным и не использовать несколько узлов вниз. Здесь мы можем выбрать атрибут TableContent , чтобы получить нужные таблицы. Там вы можете выбрать каждую отдельную таблицу, которая вам требуется, если это необходимо.

Пример кода

 table = response.xpath('//table[@class="TableContent"]')[3] 
gold_title = table.xpath('tr/td/span/text()')[2].get()
gold_value = table.xpath('tr/td/div/text()')[2].get() 
  

вывод

 'Gold: '
'31,030'
  

Объяснение

Используя атрибут класса TableContent, вы можете выбрать, какую таблицу вы хотите. Здесь я выбрал таблицу со значениями золота. Затем я выбрал каждую строку и конкретный элемент, который имеет значение gold. Значения скрыты за элементами span и div. get() возвращает строку, getall() возвращает список.

Комментарии:

1. Рад, что это сработало! Не могли бы вы отметить ответ слева, если сообщение было полезным? Большое спасибо!