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

时间:2018-04-09 16:06:13

标签: python beautifulsoup

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

这是现在的代码:

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状态代码,看看网址是否有问题,但一切似乎都没问题。

3 个答案:

答案 0 :(得分:0)

现在尝试过同样的事情,我发现的唯一一个甚至在该标签内以相同方式开始的课程是:

"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.+?"))

您可能在所选类中没有任何内容。

答案 1 :(得分:0)

实际上,错误是在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)

答案 2 :(得分:-1)

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。我认为后者更具可读性。

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