python - BeautifulSoup 不会返回页面上的所有元素

标签 python google-chrome web-scraping beautifulsoup

我是网络抓取新手,刚刚开始使用 BeautifulSoup。这是我的问题。

当您使用“define:lucid”等搜索查询在 Google 中查找单词时,大多数情况下,首页会出现一个显示含义和发音的面板。 (显示在嵌入图像的左侧)

[Google 默认词典示例]

enter image description here

我想要自动抓取和收集的是含义的文本和存储发音的mp3数据的URL。手动使用Chrome Inspector,可以在其“Elements”部分轻松找到这些内容,例如,Inspector(如图像右侧所示)显示URL,其中存储“lucid”发音的mp3数据(here) .

但是,使用requests获取搜索结果的HTML内容并使用BeautifulSoup进行解析,如下面的代码,soup只获取面板中的少量内容,例如国际音标“/ˈluːsɪd/”和属性“形容词”如下结果,并没有找到我需要的内容,比如音频元素中的东西。

如果可能的话,如何使用 BeautifulSoup 获取信息,否则哪些替代工具适合此任务?

附注我认为谷歌词典的发音质量比任何其他词典网站的发音质量都要好。所以我想坚持下去。

代码:

import requests
from bs4 import BeautifulSoup

query = "define:lucid"
goog_search = "https://www.google.co.uk/search?q=" + query

r = requests.get(goog_search)

soup = BeautifulSoup(r.text, "html.parser")
print(soup.prettify())

部分内容:

           </span>
           <span style="font:smaller 'Doulos SIL','Gentum','TITUS Cyberbit Basic','Junicode','Aborigonal Serif','Arial Unicode MS','Lucida Sans Unicode','Chrysanthi Unicode';padding-left:15px">
            /ˈluːsɪd/
           </span>
          </div>
         </h3>
         <table style="font-size:14px;width:100%">
          <tr>
           <td>
            <div style="color:#666;padding:5px 0">
             adjective
            </div>

最佳答案

您运行的基本请求不会返回通过 JavaScript 呈现的页面部分。如果您在 Chrome 中右键单击并选择查看页面源,则音频链接不存在。解决方案:您可以通过 selenium 渲染页面。使用下面的代码我得到 <audio>包含链接的标签。

你必须pip install selenium ,下载ChromeDriver并将包含它的文件夹添加到 PATH喜欢 export PATH=$PATH:~/downloads/

import requests
from bs4 import BeautifulSoup
import time
from selenium import webdriver

def render_page(url):
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(3)
    r = driver.page_source
    #driver.quit()
    return r

query = "define:lucid"
goog_search = "https://www.google.co.uk/search?q=" + query

r = render_page(goog_search)

soup = BeautifulSoup(r, "html.parser")
print(soup.prettify())

关于python - BeautifulSoup 不会返回页面上的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113924/

相关文章:

python - BeautifulSoup - <em> 给我的结果带来麻烦

node.js - 使用 request(),返回的页面还不包含需要的数据——而是返回不完整的页面。我如何 'wait' ?

python - 如何在 Django 中使用配置文件注册不同类型的用户?

python - 线性回归的梯度下降算法不优化 y 截距参数

python - 使用 PyEZ 在 Juniper 路由器中执行 vty 命令

css - em 在 Firefox 和 Chrome 中以及在 Windows 和 Linux 中具有不同的 px 大小

javascript - 使用基于 sip.js 的 webrtc 应用程序和 asterisk 11.11.0 时,chrome 没有音频。与 Firefox 和 Opera 配合良好

python - 在类中装饰 @property.setter 装饰器

javascript - 如何在 Google Chrome 的 Web Inspector 中使用单步执行和单步执行来调试 Java 脚本?

python - 获取scrapy上不同部分的数据列表