使用 beautiful soup + python 从网站上抓取元素很困难:为什么?

问题描述 投票:0回答:1

网站:https://www.wingsforlife.com/uk/

我正在努力从上述网站上抓取文章标题和链接。标题名称的示例包括“推动治愈的新颖资助模式”、“265,818 次谢谢!”和“暑期学校回来了”。它们位于“故事”部分下方。

我为每个网站都有一个字典,其中包含各种网站元素的选择器,然后我在稍后的函数中使用它来抓取信息。该功能的工作原理是我从其他网站提取了文章,因此这与该网站的选择器有关。

sites = {
        "Stories_Wings_for_Life": {
            "parent_url": "https://www.wingsforlife.com/uk/",
            "title_selector": "div.rail-slider__slide--active p.font-medium",
            "link_to_article": "div.rail-slider__slide--active > a",
        }
}

我问过chatgpt,它似乎认为上面的选择器也很好,所以它似乎是该网站特定的东西(因此我没有发布我的代码)。知道出了什么问题吗?

如果您认为需要我的代码,请告诉我!谢谢。

python web-scraping beautifulsoup
1个回答
0
投票

您尝试抓取的页面很大程度上是由 JavaScript 驱动的。处理此问题的通用模块(您需要导入)是 selenium

使用selenium,您可以获得如下文章标题:

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

def text(e, strip=True):
    if not (r := e.text):
        if (r := e.get_attribute("textContent")) is None:
            return ""
    return r.strip() if strip else r

URL = "https://www.wingsforlife.com/uk/"

options = ChromeOptions()
options.add_argument("--headless=true")

with webdriver.Chrome(options) as driver:
    driver.get(URL)
    wait = WebDriverWait(driver, 10)
    selector = By.CSS_SELECTOR, "div.w-full article.h-full"
    for article in wait.until(EC.presence_of_all_elements_located(selector)):
        p = article.find_element(By.CSS_SELECTOR, "div p")
        print(text(p))
© www.soinside.com 2019 - 2024. All rights reserved.