gpt4 book ai didi

python - 使用 Beautiful Soup 和 Python 从搜索页面提取 HTML 内容

转载 作者:行者123 更新时间:2023-12-01 02:20:44 33 4
gpt4 key购买 nike

我正在尝试使用 Beautiful Soup 从 booking.com 获取一些酒店信息。我需要从西类牙的所有住宿获取某些信息。这是搜索网址:

https://www.booking.com/searchresults.html?aid=304142&label=gen173nr-1DCAEoggJCAlhYSDNYBGigAYgBAZgBMbgBB8gBDNgBA-gBAfgBApICAXmoAgM&sid=1677838e3fc7c26577ea908d40ad5faf&class_interval=1&dest_id=197&dest_type=country&dtdisc=0&from_sf=1&group_adults=2&group_children=0&inac=0&index_postcard=0&label_click=undef&no_rooms=1&oos_flag=0&postcard=0&raw_dest_type=country&room1=A%2CA&sb_price_type=total&search_selected=1&src_elem=sb&ss=Spain&ss_all=0&ss_raw=spain&ssb=empty&sshis=0&order=popularity

当我使用开发人员工具检查结果页面中的住宿时,它说这是要搜索的标签:

<a class="hotel_name_link url" href="&#10;/hotel/es/aran-la-abuela.html?label=gen173nr-1DCAEoggJCAlhYSDNYBGigAYgBAZgBMbgBB8gBDNgBA-gBAfgBApICAXmoAgM;sid=1677838e3fc7c26577ea908d40ad5faf;ucfs=1;srpvid=b4980e34f6e50017;srepoch=1514167274;room1=A%2CA;hpos=1;hapos=1;dest_type=country;dest_id=197;srfid=198499756e07f93263596e1640823813c2ee4fe1X1;from=searchresults&#10;;highlight_room=#hotelTmpl" target="_blank" rel="noopener">
<span class="sr-hotel__name
" data-et-click="
customGoal:YPNdKNKNKZJUESUPTOdJDUFYQC:1
">
Hotel Spa Aran La Abuela
</span>
<span class="invisible_spoken">Opens in new window</span>
</a>

这是我的 Python 代码:

def init_BeautifulSoup():
global page, soup
page= requests.get("https://www.booking.com/searchresults.html?aid=304142&label=gen173nr-1DCAEoggJCAlhYSDNYBGigAYgBAZgBMbgBB8gBDNgBA-gBAfgBApICAXmoAgM&sid=1677838e3fc7c26577ea908d40ad5faf&class_interval=1&dest_id=197&dest_type=country&dtdisc=0&from_sf=1&group_adults=2&group_children=0&inac=0&index_postcard=0&label_click=undef&no_rooms=1&oos_flag=0&postcard=0&raw_dest_type=country&room1=A%2CA&sb_price_type=total&search_selected=1&src_elem=sb&ss=Spain&ss_all=0&ss_raw=spain&ssb=empty&sshis=0&order=popularity")
soup = BeautifulSoup(page.content, 'html.parser')


def get_spain_accomodations():
global accomodations
accomodations = soup.find_all(class_="hotel_name_link.url")

但是当我运行代码并打印住宿变量时,它会输出一对括号 ([])。然后我打印了 soup 对象,我意识到解析的 HTML 与我在 Chrome 开发者工具中看到的 HTML 非常不同,这就是为什么 soup 对象找不到类“hotel_name_link.url”

发生什么事了?

最佳答案

JavaScript 正在加载后修改页面。因此,当您使用 page.content 时,它会在 JS 修改页面之前为您提供页面的 HTML 内容。

您可以使用selenium渲染 JS 内容。页面加载后,可以使用driver.page_souce获取JS修改后的页面源,并将其传递给BeautifulSoup。

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

def get_page(url):
driver = webdriver.Chrome()
driver.get(url)
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'h1')))
except TimeoutException:
print('Page timed out.')
return None
page = driver.page_source
return page

def init_BeautifulSoup():
global page, soup
page = get_page('your-url')
# handle the case where page may be None
soup = BeautifulSoup(page, 'html.parser')

编辑:

您需要在这里更改一件事。

WebDriverWait(driver, 10).until(EC.presence_of_element_ located((By.TAG_NAME, 'h1'))) 部分的作用是让驱动程序显式等待,直到元素出现位于我们指定的网页上,或者在您指定的延迟时间(我使用了 10 秒)后抛出 TimeoutException

我刚刚为您提供了一个示例。您需要找出在执行 JavaScript 之前加载的页面上不存在的元素,并将其替换为:(By.TAG_NAME, 'h1')

您可以通过在页面加载后检查元素并检查该元素是否存在于页面源的 HTML 代码中来完成此操作。

您可以根据需要使用以下任意项来代替 By.TAG_NAME:IDNAMECLASS_NAME CSS_SELECTORXPATH

关于python - 使用 Beautiful Soup 和 Python 从搜索页面提取 HTML 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47965265/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com