【问题标题】:Scraping result is different from inspected DOM element抓取结果与检查的 DOM 元素不同
【发布时间】:2018-01-04 04:59:15
【问题描述】:

我想在 Python 中使用 Selenium webdriver 解析网页中的价格列表。因此,我尝试使用此代码获取所有 DOM 元素

url = 'https://www.google.com/flights/explore/#explore;f=BDO;t=r-Asia-0x88d9b427c383bc81%253A0xb947211a2643e5ac;li=0;lx=2;d=2018-01-09'
driver = webdriver.Chrome()
driver.get(url)

print(driver.page_source)

问题是我从page_source 得到的与我在检查元素中看到的不同

<div class="CTPFVNB-f-a">
    <div class="CTPFVNB-f-c"></div>
    <div class="CTPFVNB-f-d elt="toolbelt"></div>
    <div class="CTPFVNB-f-e" elt="result">Here is the difference</div>
</div>

区别存在于CTPFVNB-f-e 类中。在检查的 DOM 元素中,此标记包含我想要获取的所有价格。但是,page_source 的结果中,缺少这部分。

谁能告诉我我的代码有什么问题?还是我需要进一步的步骤来解析价格列表?

【问题讨论】:

  • 您尝试检索的内容是使用 JavaScript 动态生成的。它不在页面源中。
  • 您可能需要等到完整的 DOM 加载完毕。添加一些延迟,然后重试。

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

页面加载后,JavaScript 正在修改页面。当您在打开页面后立即打印页面源代码时,您将获得初始代码而无需执行 JavaScript。

您可以执行以下任一操作:

  • 添加延迟:使用time.sleep(x)(根据您的要求更改x的值。以秒为单位)(推荐)
  • 隐式等待: driver.implicitly_wait(x)(再次x 同上)
  • 显式等待:等待 HTML 元素出现,然后获取页面源。要了解如何做到这一点,refer this link。 (强烈推荐)

使用 explicit wait 是这里的更好的选择,因为它只等待元素变得可见所需的时间。因此不会造成任何额外的延迟。或者,如果页面加载速度比预期慢,您将无法使用隐式等待获得所需的输出。

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多