Xpath: извлечь ссылку из тега href - PullRequest
0 голосов
/ 26 февраля 2020

Я работаю над следующей веб-страницей и хочу go на каждой странице отеля, чтобы собрать данные: https://www.booking.com/searchresults.de.html?dest_id=204;dest_type=country&

Ссылка на страницу отеля находится в href тег.

<h3 class="sr-hotel__title-wrap">
  <a class="hotel_name_link url" href=" /hotel/ch/hirschen-za1-4rich.de.html?label=gen173nr-1DCAQoggJCC2NvdW50cnlfMjA0SAdYBGgsiAEBmAEHuAEHyAEN2AED6AEB-AECiAIBqAIDuAKy29byBcACAQ&dest_id=204&dest_type=country&group_adults=2&group_children=0&hapos=1&hpos=1&no_rooms=1&sr_order=popularity&srepoch=1582673331&srpvid=b5d3a51914210067&ucfs=1&from=searchresults ;highlight_room=#hotelTmpl" target="_blank" rel="noopener">
    <span class="sr-hotel__name " data-et-click=" "> Hotel Hirschen </span>
    <span class="invisible_spoken"> Wird in neuem Fenster geöffnet </span>
  </a>
</h3>

Я пытался извлечь ссылку на страницу отеля со следующими xpaths, но ничего не получил.

.//*[@class="sr-hotel__title "]/a/@href
//a[@class="hotel_name_link url"]/@href

Или я должен также использовать в xpath уровни выше (div)?

Заранее благодарен за ваши предложения!

1 Ответ

1 голос
/ 29 февраля 2020

Второй xpath работает для меня НО , только если я установил правильный User-Agent ie.

 Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0

Без User-Agent или с короткой версией Mozilla/5.0 он перенаправляет на

 https://www.booking.com/searchresults.de.html 

(без аргументов ?dest_id=204;dest_type=country&) и пустая страница без отелей.

Возможно, вам следует сначала проверить, что вы получаете по URL - ie. сохраните HTML в файле и откройте в браузере - возможно, вы также получите пустую страницу или предупреждение для ботов.


Минимальный рабочий код

Вы можете поместить его в один файл и запустить как обычный скрипт без создания проекта.

import scrapy

class MySpider(scrapy.Spider):

    name = 'myspider'

    start_urls = ['https://www.booking.com/searchresults.de.html?dest_id=204;dest_type=country&']

    def parse(self, response):
        print('url:', response.url)

        #items = response.xpath('.//*[@class="sr-hotel__title "]/a/@href').extract()
        items = response.xpath('//a[@class="hotel_name_link url"]/@href').extract()
        for item in items:
            yield {'url': item.strip()}  # to save in CSV


# --- run without project and save in `output.csv` ---

from scrapy.crawler import CrawlerProcess

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0',
    # save in file CSV, JSON or XML
    'FEED_FORMAT': 'csv',     # csv, json, xml
    'FEED_URI': 'output.csv', #
})
c.crawl(MySpider)
c.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...