为什么我的soup对象返回一个空白列表?

2024-06-07 14:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个程序,在一个亚马逊搜索结果页中的所有“畅销书”,并打开一个新的标签每一个。你知道吗

这是目前的代码:

import webbrowser, sys, requests
from bs4 import BeautifulSoup

amazonSearch = "".join(sys.argv[1:])
amazonResults = "https://www.amazon.com/s/ref=nb_sb_noss_1?url=search- 
alias%3Daps&field-keywords=" + amazonSearch

#getting search links
page = requests.get(amazonResults)
soup = BeautifulSoup(page.text, "html.parser")
searchLinks = soup.find_all("a", {"class": "a-link-normal s-access-detail- 
page  s-color-twister-title-link a-text-normal"})

if len(sys.argv) > 1:
webbrowser.open_new_tab(amazonResults)
print(page.status_code)
print(searchLinks)
else:
    webbrowser.open_new_tab("https://www.amazon.com/")

现在,我无法获得所有带有class=a-link-normal s-access-detail-page s-color-twister-title-link a-text-normal的锚定标记的列表。打印列表时,结果是空白的。我还检查了http状态码,看看URL是否有问题,但一切似乎都很好。你知道吗


Tags: texthttpsimportamazonwwwsyspagelink
3条回答

我现在也尝试过同样的方法,但我找到的唯一一个在标记中以同样的方式开始的类是:

"a-link-normal s-ref-text-link"

再次检查结果页。你知道吗

import requests
from bs4 import BeautifulSoup
amazonResults = "https://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=" +"books"
page = requests.get(amazonResults)
soup = BeautifulSoup(page.text, "html.parser")
searchLinks = soup.find_all(class_=re.compile("a-link-normal\s.+?"))

在所选类中可能没有任何内容。你知道吗

实际上,错误是类atribute中有一个额外的空间在page s-color之间

使用以下语法获取这些超链接应该没有问题:

searchLinks = [s['href'] for s in soup.find_all("a", {"class": "a-link-normal s-access-detail-page s-color-twister-title-link a-text-normal"})]

编辑:

您还必须更改请求标题,否则页面将不会加载内容:

import requests
from bs4 import BeautifulSoup

amazonResults = "https://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=python"

with requests.session() as s:
    s.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0'}
    page = s.get(amazonResults)
    soup = BeautifulSoup(page.text, "html.parser")
    searchLinks = [s['href'] for s in soup.find_all("a", {"class": "a-link-normal s-access-detail-page s-color-twister-title-link a-text-normal"})]
    print(searchLinks)

a-link-normal s-access-detail-page s-color-twister-title-link a-text-normal类用于指示赞助项目。请注意,即使在站点的源代码中,类名之间有一个双空格,BeautifulSoup也会在某个地方删除它,您需要删除它才能将元素作为目标。你知道吗

使用下面的代码以赞助项目和普通项目为目标:

searchLinks = soup.find_all("a", {"class": "a-link-normal a-text-normal"})

或者

searchLinks = soup.select('a.a-link-normal.a-text-normal')

如果你喜欢CSS Selectors。我认为后者更具可读性。你知道吗

代码中有一个bug,您可以修复:amazonSearch = "".join(sys.argv[1:])。您需要使用+分隔符来分隔搜索关键字。改用"+".join(sys.argv[1:])。你知道吗

相关问题 更多 >

    热门问题