我正在尝试在维基百科的弹出窗口中抓取链接的名称。因此,当您将鼠标悬停在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进行抓取。
答案 0 :(得分:6)
在您的问题中,您说您“ ...无法再拨打网页...”,但这就是您的浏览器在后台进行的操作。您正在查看的页面的html不包含所需的内容。
对此进行演示:
将鼠标悬停在页面中的链接上,例如Ancient Greek。
您会看到,将鼠标悬停在链接上会触发向Ancient_Greek summary page的GET请求。
在网络标签日志中单击“ Ancient_Greek”以显示请求的详细信息。
单击右侧的“响应”选项卡。
您应该看到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之类的数据来抓取数据。
您可以使用post或splinter之类的浏览器控制器,该控制器将允许您自动悬停在鼠标上或单击鼠标以弹出弹出窗口,然后提取其数据。获得弹出的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"));