在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看起来很乱,与我手动看到的完全不同。我知道为什么会这样吗?
答案 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]))