搜寻网站针对链接返回了不同的href

时间:2018-10-14 09:09:07

标签: python html web-scraping beautifulsoup python-requests

在python中,我正在使用requests模块和BS4来通过duckduckgo.com搜索网络。我手动进入http://duckduckgo.com/html/?q='hello',并使用开发人员工具获得了第一个结果标题为<a class="result__a" href="http://example.com">。现在,我使用以下代码通过Python获取href:

html = requests.get('http://duckduckgo.com/html/?q=hello').content
soup = BeautifulSoup4(html, 'html.parser')
result = soup.find('a', class_='result__a')['href']

但是,href看起来很乱,与我手动看到的完全不同。我知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

有多个DOM元素,其类名称为'result__a'。因此,不要期望您看到的第一个链接是第一个。

您提到的“乱码”是一个编码的URL。您需要对其进行解码和解析以获取URL的参数(参数)。

例如: “ /l/?kh=-1&uddg=https%3A%2F%2Fwww.example.com”

上面的href包含两个参数,即kh和uddg。 uddg是您需要的实际链接。

下面的代码将获取该特定类的所有URL,且不加引号。

import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs, unquote
html = requests.get('http://duckduckgo.com/html/?q=hello').content
soup = BeautifulSoup(html, 'html.parser')
for anchor in soup.find_all('a', attrs={'class':'result__a'}):
  link = anchor.get('href')
  url_obj = urlparse(link)
  parsed_url = parse_qs(url_obj.query).get('uddg', '')
  if parsed_url:
    print(unquote(parsed_url[0]))