2017-09-08 74 views
1

对我是新来的网页抓取,只是使用BeautifulSoup开始。这是我的问题。在大多数情况下,呈现出意义的面板和语音出现在头版:BeautifulSoup并不返回所有的元素

当使用像“清晰界定”的搜索查询您查找在谷歌一个字以这样的方式。 (在嵌入式图像的左侧所示)

[谷歌为默认字典示例]

enter image description here

事情要刮掉并自动收集有含义的文字和网址其中存储了发音的mp3数据。手动使用Chrome检查器,这些很容易被其“元素”部分中,例如在发现,检查员(在图像的右侧示出)示出了URL,其存储的“清晰”的读音的MP3数据(here) 。

但是,使用请求获取搜索结果的HTML内容并使用BeautifulSoup解析它,如下面的代码所示,soup仅在面板中获得少数内容,例如IPA“/luːsɪd/”和下面的结果一样,属性“形容词”,并且我不需要找到任何内容,比如音频元素中的东西。

?我怎样才能与BeautifulSoup的信息,如果可能的话,否则什么替代工具是非常适合这项工作?

P.S.我认为谷歌词典的发音质量要好于任何其他词典站点的发音质量。所以我想坚持下去。

代码:

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()) 

soup内容部分:

  </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> 

回答

0

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

你必须pip install selenium,下载ChromeDriver和包含它的文件夹添加到PATHexport 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()) 
+0

该解决方案完美适用于缺少音频文件和文本的含义。 –

+0

好听!如果它有帮助,你能接受答案/ upvote吗?谢谢,祝你好运! – Andras

+0

现在不显示upvote,因为我的声望低于15 lol。我不接受答案的原因是我想在不打开实际浏览器的情况下获取页面内容。我在最后的评论中没有提到这一点的原因是我认为我应该尝试[this](https://sqa.stackexchange.com/questions/2609/running-webdriver-without-opening-actual-浏览器窗口)首先由我自己。 –

1

我检查。你是对的,在BeautifulSoup输出中由于某种原因没有音频元素。不过,在检查代码,我发现这是谷歌使用音频文件,这是http://ssl.gstatic.com/dictionary/static/sounds/oxford/lucid--_gb_1.mp3和完美的,如果你代替“清醒”与其他任何文字作品来源。

所以,如果你需要刮音频文件,你可能只是做到以下几点:

url='http://ssl.gstatic.com/dictionary/static/sounds/oxford/'  
audio=requests.get(url+'lucid'+'--_gb_1.mp3', stream=True).content 
with open('lucid'+'.mp3', 'wb') as f: 
    f.write(audio) 

至于其他的元素,恐怕你只需要找到单词“定义”在汤中,并刮掉包含它的标签的内容。

+0

解决方案很聪明。知道存储在跟随的“_gb_1.8”像“inculpate”或领先的“x”像“显眼”的词的变化,我得到了数百个单词的音频文件。 –

相关问题