Я много раз пытался получить данные с booking.com. Но я не мог - PullRequest
0 голосов
/ 06 октября 2019

Я хочу удалить данные с сайта booking.com, но получил несколько ошибок и не смог найти похожие коды. Я хочу удалить название отеля, цену и т. Д.

Я пробовал BeautifulSoup 4 и пытался получить данные в CSV-файл.

import requests
from bs4 import BeautifulSoup
import pandas

# Replace search_url with a valid one byb visiting and searching booking.com
search_url = 'https://www.booking.com/searchresults.....'
page = requests.get(search_url)
soup = BeautifulSoup(page.content, 'html.parser')

week = soup.find(id = 'search_results_table'  )
#print(week)

items = week.find_all(class_='sr-hotel__name')
print(items[0])
print(items[0].find(class_ = 'sr-hotel__name').get_text())
print(items[0].find(class_ = 'short-desc').get_text())

Здесь - это пример URL, который можно использовать вместо search_url.

Это сообщение об ошибке ...

<span class="sr-hotel__name " data-et-click="
">
The Fort Printers
</span>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-44-77b38c8546bb> in <module>
     11 items = week.find_all(class_='sr-hotel__name')
     12 print(items[0])
---> 13 print(items[0].find(class_ = 'sr-hotel__name').get_text())
     14 print(items[0].find(class_ = 'short-desc').get_text())
     15 

AttributeError: 'NoneType' object has no attribute 'get_text'

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Вместо использования метода find() несколько раз, если вы решите использовать метод getText () напрямую, это может помочь.

import requests
from bs4 import BeautifulSoup
import pandas

# Replace search_url with a valid one byb visiting and searching booking.com
search_url = 'https://www.booking.com/searchresults.....'
page = requests.get(search_url)
soup = BeautifulSoup(page.content, 'html.parser')

week = soup.find(id = 'search_results_table'  )
#print(week)

items = week.find_all(class_='sr-hotel__name')
# print the whole thing
print(items[0])
hotel_name = items[0].getText()

# print hotel name
print(hotel_name)

# print without newlines
print(hotel_name[1:-1])

Надеюсь, это поможет. Я бы посоветовал прочитать больше документации BeautifulSoup.

0 голосов
/ 06 октября 2019

Прежде всего, приятель, использование запросов может быть очень сложным, поскольку вам нужно полностью имитировать запрос, который отправит ваш браузер. Вам придется использовать какой-нибудь инструмент для сниффинга (отрыжка, скрипач, wireshark) или, в некоторых случаях, посмотреть на сеть в режиме разработчика на вашем браузере, что относительно сложно ...

Я бы посоветовал вамиспользуйте «selenium», который является веб-драйвером, который облегчает вашу жизнь при попытке очистить сайты ... подробнее об этом здесь - https://medium.com/the-andela-way/introduction-to-web-scraping-using-selenium-7ec377a8cf72

А что касается вашей ошибки, я думаю, что вы должны использовать только. текст вместо .get_text ()

...