【问题标题】:Why is requests.get() retrieving different HTML using Python than browser?为什么 requests.get() 使用 Python 检索与浏览器不同的 HTML?
【发布时间】:2026-01-23 04:35:01
【问题描述】:

我正在尝试从 HTML 表中提取数据,但使用 requests.get() 时似乎无法正确加载 HTML。相反,源代码中的一行显示:

“JavaScript 未启用,因此此页面可能无法正常运行。”

当我在谷歌浏览器中导航到该页面时,HTML 会正常显示。

如何获取 Python 脚本来加载正确的 HTML?

【问题讨论】:

  • 它很可能检索到完全相同的 HTML。只是在浏览器中,Javascript 运行并隐藏了这一行或将这一行替换为其他内容。
  • 问题解决了吗?有任何答案有帮助吗?

标签: javascript python html web-scraping


【解决方案1】:

欢迎来到奇妙的网络爬行世界。您遇到的问题是 requests.get() 只会让您获得浏览器在页面加载开始时收到的初始页面。但是,这不是您在浏览器中看到的页面,因为形成网页可能涉及很多内容:javascript 函数调用、AJAX 调用等。

如果您想以编程方式获取页面加载后在 Web 浏览器中单击“显示源代码”时看到的 HTML - 您需要一个真正的浏览器。这是那里selenium 可能是一个不错的选择:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get(url)
print browser.page_source

请注意,selenium 本身在 locating elements 方面非常强大 - 您不需要单独的 HTML 解析器来从页面中提取数据。

希望对您有所帮助。

【讨论】:

  • selenium这种情况下需要启用JavaScript的唯一选择吗?
  • @DmitriyFialkovskiy 不,还有其他选项,例如:“splash”JS 引擎之类的东西,使用浏览器开发人员工具,然后请求模仿页面上的 ajax/xhr 调用。跨度>
【解决方案2】:

如果您确定必须处理 JavaScript,webdriver 将处理得更好,并挽救您的生命。

from selenium.common.exceptions import NoSuchElementException
from selenium import webdriver
from time import sleep

browser = webdriver.Firefox()
browser.get("http://yourwebsite.com/html-table")
browser.find_element_by_id("some-js-triggering-elem").click()
while 1:
    try:
        browser.find_element_by_id("elem-that-makes-you-know-that-table-is-loaded")
    except NoSuchElementException:
        sleep(1)
html = browser.find_element_by_xpath("//*").get_attribute("outerHTML")
# Use PyQuery or something else to parse the html and get data from table

【讨论】:

    最近更新 更多