【问题标题】:How to open links in Amazon using BeautifulSoup4?如何使用 BeautifulSoup4 在亚马逊打开链接?
【发布时间】:2019-09-17 13:18:12
【问题描述】:

问题:“linkElems”列表似乎是空的

怀疑是什么导致了问题:我认为我告诉它抓取的标签是错误的

程序功能:

  • 在 Amazon.com 中搜索命令行中的参数并下载 网站进入变量“res”
  • 选择链接的 URL 搜索结果并将它们存储到名为“linkElems”的列表中
  • 为前 5 个结果打开新的浏览器标签

上下文:我已经完成了 Automate the Boring stuff 的第 11 章,并使用了第一个项目中的相同代码,只是我稍微调整了一下以搜索 Amazon 搜索结果而不是 google .

我尝试过哪些标签:

  • 'a'
  • 'h2.一个'
  • 'a.a-link-normal a-text-normal'
  • '.h2 a'
#! python3
#Shop on Amazon - searchs amazon and opens the first 5 top results

import sys,requests,bs4,webbrowser,logging

print ('Searching')

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'
}

res = requests.get('https://www.amazon.com/s?k=' + ''.join(sys.argv[1:]))
res.raise_for_status

soup = bs4.BeautifulSoup(res.text,features = 'html.parser')

linkElems = soup.select('a.a-link-normal a-text-normal')
numOpen = min(5, len(linkElems))
for i in range(numOpen):
    webbrowser.open('https://amazon.com' + linkElems[i].get('href'))

H我尝试使用标签抓取的链接的 TML 示例:

Sample HTML That I'm searching

Example of me running the program and its output

【问题讨论】:

  • 查看这篇文章的答案!它可能会有所帮助。问题是类似的。 stackoverflow.com/questions/11465555/…
  • @francovici 谢谢。我检查了那个链接,但它并没有完全解决我的问题。在本书的前一个项目中,它显示了来自谷歌搜索的链接如何是“div r”类的兄弟,所以我尝试对亚马逊做类似的事情搜索,但它似乎没有抓住它们,所以我想我不明白如何判断要使用哪个标签。

标签: python css web-scraping


【解决方案1】:

您的问题是您的 css 选择器'a.a-link-normal a-text-normal'。这将在 a 标签内查找 a-text-normal 标签,类为 a-link-normal

a-link-normala-text-normal 是相关a 标记的both 类。您可以通过像这样链接它们在 css 选择器中表达这一点:'a.a-link-normal.a-text-normal'。这表示您正在寻找一个a 标签,它同时具有a-link-normal a-text-normal 类。

例如,此脚本将在亚马逊搜索您的命令行输入,收集所有链接 (links = soup.select('a.a-link-normal.a-text-normal')),然后为找到的每个链接打印出 href 属性。在这一点上,我只能说,它可以在我的机器上运行。

from bs4 import BeautifulSoup
import requests
from sys import argv


r = requests.get("https://www.amazon.com/s?k=" + '+'.join(argv[1:]))
r.raise_for_status()

soup = BeautifulSoup(r.content, 'html.parser')
links = soup.select('a.a-link-normal.a-text-normal')

for tag in links:
    print(tag.attrs['href'])

【讨论】:

  • 既然你提到了它,选择器看起来确实不像它所表达的那样工作。看起来这个空间应该是一个句号,就像你提到的那样。 ( a.a-link-normal a-text-normal -> a.a-link-normal.a-text-normal )
  • @isaactfa 我明白你在说什么。我花了一些时间尝试和实验,但我仍然无法得到它。我将编辑我的帖子以包含我尝试使用该标签获取的 HTML 片段之一。
  • 我已经修改了一个示例脚本来回答我的问题。如果这对您不起作用,那么您获取 HTML 的方式可能有问题。
  • 有趣。我将您的代码复制并粘贴到测试程序中,但它仍然没有做任何事情。我会继续试验和研究。如果我找到答案,我会保持打开状态,以便信息可以在那里。
  • 您遇到错误了吗?你什么都得不到吗?你有什么意见?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多