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

Poo*_*kie 10 python beautifulsoup

我试图在维基百科的弹出窗口中删除链接的名称.因此,当您在维基百科中悬停链接时,它会从该链接的介绍中显示一些小片段.我需要抓取这些信息,但我不确定它在源头中的位置.当我检查元素时(因为它弹出)这是html(对于这个例子,我将鼠标悬停在链接"希腊语"上)

<a dir="ltr" lang="en" class="mwe-popups-extract" href="/wiki/Ancient_Greek"> 
<p>The <b>Ancient Greek</b> language includes the forms of Greek...(a bunch more text)...</p></a> 
Run Code Online (Sandbox Code Playgroud)

我需要提取的是href ="/ wiki/Ancient_Greek"但是当我没有悬停链接时,这段html消失了.有没有办法(用BS4和python)用我正在抓取的源html提取这些信息?

编辑:我无法承担额外的网页调用,因为项目需要很长时间才能运行.如果无论如何都要改变我检索源的方式,这样我就可以获得有用的弹出信息.这个项目非常庞大,获取此弹出信息至关重要.

任何不需要完全重建项目的建议都非常感激 - 我正在使用urllib来获取源(带请求)和bs4来完成.

stx*_*101 6

在您的问题中,您说"......无法承担额外的网页呼叫......"但这就是您的浏览器在幕后所做的事情.您正在查看的页面的html不包含您需要的内容.

为了证明这一点:

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

    您将看到悬停在链接上的行为会触发对Ancient_Greek摘要页面的GET请求.

  5. 单击网络选项卡日志中的"Ancient_Greek"以显示请求的详细信息.

  6. 单击右侧的"响应"选项卡.

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

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


小智 5

弹出窗口和其他数据只能通过javascript动态显示,你不能只使用urllib之类的东西来抓取数据.

您可以使用像splinterselenium这样的浏览器控制器,它允许您自动悬停或单击事物以显示弹出窗口,然后提取其数据.获得弹出式HTML后,您可以使用BS4进行清理.

例如:

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