#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. Рад, что это сработало! Не могли бы вы отметить ответ слева, если сообщение было полезным? Большое спасибо!