使用BS4从隐藏的html(弹出)获取数据

时间:2018-07-17 13:05:12

标签: python beautifulsoup

我正在尝试在维基百科的弹出窗口中抓取链接的名称。因此,当您将鼠标悬停在Wikipedia中的链接上时,它会从介绍到该链接的内容中弹出一个小片段。我需要抓取该信息,但不确定其来源。当我检查元素时(它弹出时),这是html(对于本示例,我将鼠标悬停在链接“希腊”上)

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));

我需要提取的href是=“ / wiki / Ancient_Greek”,但是当我不悬停链接时,这段html就会消失。有没有一种方法(使用BS4和python)来提取我正在抓取的源html的此信息?

编辑:我无法承受对网页的额外调用,因为该项目需要很长时间才能按原样运行。无论如何,如果要更改我检索源的方式,以便我可以获得有用的弹出信息。这个项目很大,获得此弹出信息至关重要。

非常感谢所有不需要完全重建项目的建议-我正在使用urllib提取源代码(带有请求)和bs4进行抓取。

3 个答案:

答案 0 :(得分:6)

在您的问题中,您说您“ ...无法再拨打网页...”,但这就是您的浏览器在后台进行的操作。您正在查看的页面的html不包含所需的内容。

对此进行演示:

  1. 在浏览器中,打开一个维基百科页面,例如Greek
  2. 打开“开发人员工具”窗口(Chrome中为Ctrl + Shift + i)。
  3. 单击“网络”选项卡,并确保红色按钮点亮,以便记录所有Web请求。
  4. 将鼠标悬停在页面中的链接上,例如Ancient Greek

    您会看到,将鼠标悬停在链接上会触发向Ancient_Greek summary page的GET请求。

  5. 在网络标签日志中单击“ Ancient_Greek”以显示请求的详细信息。

  6. 单击右侧的“响应”选项卡。

    您应该看到JSON响应,其中包含一个名为“ extract_html”的字段,其中包含您需要的内容:"<p>The <b>Ancient Greek</b> language includes the forms...

因此,为了获取所需的信息,每次遇到指向<a href="/wiki/something" /a>的链接时,您都必须向https://en.wikipedia.org/api/rest_v1/page/summary/something发出GET请求

答案 1 :(得分:5)

使用仅通过javascript动态显示的弹出窗口和其他数据,您不能仅使用urllib之类的数据来抓取数据。

您可以使用postsplinter之类的浏览器控制器,该控制器将允许您自动悬停在鼠标上或单击鼠标以弹出弹出窗口,然后提取其数据。获得弹出的html之后,可以使用BS4对其进行清理。

例如:

from splinter import Browser
browser = Browser()
browser.visit("http://google.com")
button = browser.find_by_name('button1')
button.click()

答案 2 :(得分:0)

您可以为此使用硒

这是一个有关如何查找按名称输入的html文本的简单演示:

<form>
  <input type="text" name="username">
  <input type="text" name="password">
</form>

这是使用硒驱动程序的python代码:

import org.openqa.selenium.By; 
import org.openqa.selenium.WebElement; 
WebElement usernameElement = driver.findElement(By.name("username")); 
WebElement passwordElement = driver.findElement(By.name("password"));