从<a>美丽的汤中提取href

Gla*_*ery 4 python beautifulsoup

我正在尝试从谷歌搜索结果中提取链接.Inspect元素告诉我,我感兴趣的部分有"class = r".第一个结果如下:

<h3 class="r" original_target="https://en.wikipedia.org/wiki/chocolate" style="display: inline-block;">
    <a href="https://en.wikipedia.org/wiki/Chocolate" 
       ping="/url?sa=t&amp;source=web&amp;rct=j&amp;url=https://en.wikipedia.org/wiki/Chocolate&amp;ved=0ahUKEwjW6tTC8LXZAhXDjpQKHSXSClIQFgheMAM" 
       saprocessedanchor="true">
        Chocolate - Wikipedia
    </a>
</h3>
Run Code Online (Sandbox Code Playgroud)

要提取"href"我做:

import bs4, requests
res = requests.get('https://www.google.com/search?q=chocolate')
googleSoup = bs4.BeautifulSoup(res.text, "html.parser")
elements= googleSoup.select(".r a")
elements[0].get("href")
Run Code Online (Sandbox Code Playgroud)

但我意外得到:

'/url?q=https://en.wikipedia.org/wiki/Chocolate&sa=U&ved=0ahUKEwjHjrmc_7XZAhUME5QKHSOCAW8QFggWMAA&usg=AOvVaw03f1l4EU9fYd'
Run Code Online (Sandbox Code Playgroud)

我想要的地方:

"https://en.wikipedia.org/wiki/Chocolate"

属性"ping"似乎令人困惑.有任何想法吗?

Key*_*dar 7

发生了什么?

如果您打印响应内容(即googleSoup.text),您将看到您获得完全不同的HTML.页面源和响应内容不匹配.

不会发生,因为内容是动态加载的; 即便如此,页面源和响应内容也是一样的.(但是在检查元素时看到的HTML是不同的.)

对此的基本解释是Google识别Python脚本并更改其响应.

解:

为了解决这个问题,您可以传递假文件User-Agent使脚本看起来像真正的浏览器.


码:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}

r = requests.get('https://www.google.co.in/search?q=chocolate', headers=headers)
soup = BeautifulSoup(r.text, 'lxml')

elements = soup.select('.r a')
print(elements[0]['href'])
Run Code Online (Sandbox Code Playgroud)

输出:

https://en.wikipedia.org/wiki/Chocolate
Run Code Online (Sandbox Code Playgroud)

资源: