使用beautifulsoup和Python从搜索页面提取HTML内容

2024-05-23 18:11:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从预订网站用漂亮的汤。我需要从西班牙所有的住宿处得到一些信息。这是搜索url:

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代码:

^{pr2}$

但是当我运行代码并打印acomodations变量时,它会输出一对括号([])。然后我打印了soup对象,我意识到解析后的HTML与我在Chrome的开发工具中看到的非常不同,这就是soup对象找不到类“hotel\u name”的原因_链接.url““

怎么回事?在


Tags: nameurlhtmltypecountryhotelsslabel
1条回答
网友
1楼 · 发布于 2024-05-23 18:11:53

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')))的作用是让驱动程序显式地等待,直到元素位于我们指定的网页上,或者在您指定的延迟时间之后抛出TimeoutException(我用了10秒)。在

我刚刚给你举了一个例子。在执行JavaScript之前,您需要找出加载页面上不存在的元素,并在此处替换它:(By.TAG_NAME, 'h1')

检查页面中的元素是否存在,并检查该元素在页面中是否存在。在

您可以根据您的需求使用以下任意一种,而不是By.TAG_NAMEIDNAMECLASS_NAMECSS_SELECTORXPATH。在

相关问题 更多 >