Python 使用bs4迭代易趣物品

Python 使用bs4迭代易趣物品,python,for-loop,beautifulsoup,Python,For Loop,Beautifulsoup,我在bs4中遇到for循环问题,请参阅下面的代码: from urllib.request import urlopen from bs4 import BeautifulSoup import request html = urlopen('https://www.ebay.com/sch/i.html?_from=R40&_nkw=manga&_sacat=0&rt=nc&LH_Sold=1&LH_Complete=1') soup = Beauti

我在bs4中遇到for循环问题,请参阅下面的代码:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import request

html = urlopen('https://www.ebay.com/sch/i.html?_from=R40&_nkw=manga&_sacat=0&rt=nc&LH_Sold=1&LH_Complete=1')
soup = BeautifulSoup(html.read(), 'html.parser')

#soldItem = soup.find_all('h3', class_='s-item__title s-item__title--has-tags')
#salePrice = soup.find_all('span', class_='POSITIVE')

itemContainer = soup.find('ul', class_='srp-results srp-list clearfix')

for x in itemContainer.findAll('li'):
    #item = x.get_text()
    item = itemContainer.findAll('h3', class_='s-item__title s-item__title--has-tags').get_text()
    sale = itemContainer.findAll('span', class_='POSITIVE').get_text()
    data = {item:sale}
    print(data)
我收到以下错误消息:

AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?
我希望能够在第1页中反复浏览易趣上的每个物品,并获得物品名称和售价。我试过几种方法,但这个错误一直存在。我已经到了这种错误不再出现的地步,但是我的变量在第一行上迭代了50次


关于如何以以下格式生成数据{item name:sale price}有什么想法吗?

您的问题正是错误消息所说的-您使用的是
findAll
,而您应该使用
find
。此外,您将在itemContainer中找到所有h3和跨度,而不是容器中的每个项目(
x

试着替换

item = itemContainer.findAll('h3', class_='s-item__title s-item__title--has-tags').get_text()
sale = itemContainer.findAll('span', class_='POSITIVE').get_text()

编辑:

还有一件事:当您在itemContainer.findAll('li')中对x执行
操作时,您将在itemContainer中找到所有的li。碰巧在该列表中有不止一个要出售的项目,所以它会找到一些没有带嵌套跨距或文本的h3的项目。这就是它失败的原因。使用
itemContainer.findAll('li',class='s-item')
缩小搜索范围就可以做到这一点

下面是完整的代码现在应该是什么:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

html = urlopen('https://www.ebay.com/sch/i.html?_from=R40&_nkw=manga&_sacat=0&rt=nc&LH_Sold=1&LH_Complete=1')
soup = BeautifulSoup(html.read(), 'html.parser')

#soldItem = soup.find_all('h3', class_='s-item__title s-item__title--has-tags')
#salePrice = soup.find_all('span', class_='POSITIVE')

itemContainer = soup.find('ul', class_='srp-results srp-list clearfix')

for x in itemContainer.find_all('li', class_='s-item'):
    item = x.find('h3', class_='s-item__title s-item__title--has-tags').get_text()
    sale = x.find('span', class_='POSITIVE').get_text()
    data = {item:sale}
    print(data)

请注意,我还将
findAll
更改为
find_all
,这只是函数的另一个名称,更接近于pep8命名约定。同样的方法也可以应用于将
itemContainer
重命名为
item\u container
等,但这并不是完全必要的。

对,但我得到了这样的结果:AttributeError:'NoneType'对象没有属性'get\u text'确定。我已经有一段时间没有使用bs4了。是时候让我的谷歌浏览器工作了!我很快会给你回复的,终于找到了。当它寻找
li
s时,它会找到所有的。出售的物品不止这些,因此通过
class.='s-item'
缩小范围就可以了。我将编辑我的答案。只需运行代码,它就可以工作了!非常感谢你,我得仔细看看你的答案,看看我做错了什么。我被卡住了,因为get_text()方法无法正确返回我的项目。因此,我假设通过设置find_all和循环的开头,它将迭代每个项目,在look中,我必须利用find()和get_text(),谢谢您的帮助!您是否使用了任何特定的来源来帮助您理解/找到答案,或者仅仅是多年的实践
from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests

html = urlopen('https://www.ebay.com/sch/i.html?_from=R40&_nkw=manga&_sacat=0&rt=nc&LH_Sold=1&LH_Complete=1')
soup = BeautifulSoup(html.read(), 'html.parser')

#soldItem = soup.find_all('h3', class_='s-item__title s-item__title--has-tags')
#salePrice = soup.find_all('span', class_='POSITIVE')

itemContainer = soup.find('ul', class_='srp-results srp-list clearfix')

for x in itemContainer.find_all('li', class_='s-item'):
    item = x.find('h3', class_='s-item__title s-item__title--has-tags').get_text()
    sale = x.find('span', class_='POSITIVE').get_text()
    data = {item:sale}
    print(data)