从抓取bs4中过滤python中的数据
Posted
技术标签:
【中文标题】从抓取bs4中过滤python中的数据【英文标题】:filtering data in python from scraping bs4 【发布时间】:2021-12-24 08:13:42 【问题描述】:我对如何过滤从 ebay 上的 scraping 数据中获得的数据有点困惑,这里的代码如下:
from bs4 import BeautifulSoup
import requests
url ='https://www.ebay.fr/sch/267/i.html?_from=R40&_nkw=star+wars&_sop=10&_ipg=200'
def get_data(url):
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
return soup
def parse(soup):
results = soup.find_all('div', 'class' : 's-item__info clearfix')
for item in results:
data = []
try:
Title = item.find('h3', 'class': 's-item__title').text.replace('Nouvelle annonce','')
Price = item.find('span', 'class':'s-item__price').text
Link = item.find('a', 'class' : 's-item__link')['href']
products = 'Title' : Title, 'Price' : Price, 'Link' : Link
data.append(products)
print(data)
except:
continue
return
soup = get_data(url)
parse(soup)
使用该代码,我可以从 ebay 的页面中获取所有书籍,但我只想要我在 print(data)
使用以下关键字时获得的列表中的特定书籍:
['Title': 'Star Wars - Rebels T05', 'Price': '8,53 EUR', 'Link': 'https://www.ebay.fr/itm/265401372083?hash=item3dcb278db3:g:g00AAOSwTmBhjXjq']
['Title': 'Official Lego� Star Wars Annual 2016 (Lego Annuals), , Used; Good Book', 'Price': '8,42 EUR', 'Link': 'https://www.ebay.fr/itm/165178509530?hash=item26756808da:g:NU4AAOSwsldhjXi2']
['Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR', 'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt']
['Title': 'STARFIX 007 1983 STAR WARS La guerre des étoiles III Les PREDATEURS GWENDOLINE', 'Price': '12,90 EUR', 'Link': 'https://www.ebay.fr/itm/294540446774?hash=item4493fa8c36:g:EMUAAOSwWjxhjXNe']
['Title': 'Star Wars, Der Kristallstern de McIntyre, Vonda N.,... | Livre | état acceptable', 'Price': '3,53 EUR', 'Link': 'https://www.ebay.fr/itm/124998670341?hash=item1d1a805805:g:6xIAAOSwKmZhjWPn']
我想使用关键字:“Thrawn”,所以我只得到第 3 行:
['Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR', 'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt']
此时我被卡住了,我尝试了很多尝试if
,string
,attrs
,但直到现在我没有得到任何结果,那么我该如何实现“关键字”? :)
谢谢
【问题讨论】:
【参考方案1】:有几种方法可以找到包含关键字“Thrawn”的书名。
首先,单个数据元素是字典,因此必须使用 str(dict) 修改基本字符串。
book_titles = parse(soup)
book = [title for title in book_titles if 'Thrawn' in str(title)]
print(book)
# output
['Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR', 'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt', 'Title': 'Star Wars™ Thrawn de Zahn, Timothy | Livre | état très bon', 'Price': '10,77 EUR', 'Link': 'https://www.ebay.fr/itm/124997651763?hash=item1d1a70cd33:g:FhoAAOSwPF9hjIs-']
book_titles = 解析(汤) 这是另一种使用正则表达式的方法。
book = [title for title in book_titles if regex.search('Thrawn', str(title))]
print(book)
# output
['Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR', 'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt', 'Title': 'Star Wars™ Thrawn de Zahn, Timothy | Livre | état très bon', 'Price': '10,77 EUR', 'Link': 'https://www.ebay.fr/itm/124997651763?hash=item1d1a70cd33:g:FhoAAOSwPF9hjIs-']
这是另一种方式:
book_titles = parse(soup)
for title in book_titles:
for key, value in title.items():
if key == 'Title':
if 'Thrawn' in value:
print(title)
# output
'Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR',
'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt'
'Title': 'Star Wars™ Thrawn de Zahn, Timothy | Livre | état très bon', 'Price': '10,77 EUR',
'Link': 'https://www.ebay.fr/itm/124997651763?hash=item1d1a70cd33:g:FhoAAOSwPF9hjIs-'
函数解析也需要返回数据,所以这样做:
def parse(soup):
data = []
results = soup.find_all('div', 'class' : 's-item__info clearfix')
for item in results:
try:
Title = item.find('h3', 'class': 's-item__title').text.replace('Nouvelle annonce','')
Price = item.find('span', 'class':'s-item__price').text
Link = item.find('a', 'class': 's-item__link')['href']
products = 'Title': Title, 'Price': Price, 'Link': Link
data.append(products)
except:
continue
return data
这是查找多本书的一种方法:
book_titles = parse(soup)
for title in book_titles:
for key, value in title.items():
if key == 'Title':
for book in ['INTEGRALE', 'Thrawn']:
if book in value:
print(title)
# output
'Title': 'Thrawn (Star Wars) de Zahn, Timothy | Livre | état très bon', 'Price': '10,95 EUR',
'Link': 'https://www.ebay.fr/itm/124998742900?hash=item1d1a817374:g:zBQAAOSwSGFhjXPt'
'Title': 'DARK MAUL INTEGRALE , STAR WARS LEGENDES, LIVRE NEUF (RARE) ', 'Price': '25,00 EUR',
'Link': 'https://www.ebay.fr/itm/175018282734?hash=item28bfe70eee:g:t1YAAOSwOsFhhW1Q'
'Title': 'LES OMBRES DE L EMPIRE INTEGRALE , STAR WARS LEGENDES, LIVRE NEUF ',
'Price': '20,00 EUR',
'Link': 'https://www.ebay.fr/itm/175018277970?hash=item28bfe6fc52:g:ASgAAOSwyFphhWsW'
'Title': 'Star Wars™ Thrawn de Zahn, Timothy | Livre | état très bon', 'Price': '10,77 EUR',
'Link': 'https://www.ebay.fr/itm/124997651763?hash=item1d1a70cd33:g:FhoAAOSwPF9hjIs-'
【讨论】:
非常感谢 :) 我实际上在 Try / 中设置了 if 条件,但我猜它为什么不起作用。我尝试了你写的第三种方式,效果很好 如果我想在多个关键字中搜索怎么办?我尝试了以下方法:keywords = 'INTEGRALE', 'Thrawn'
for title in book_titles: for key, value in title.items(): if key == 'Title': if keywords in value: print(title)
,所以我得到了所有包含这个词的书:INTEGRALE、Thrrawn 等……但上面写着:TypeError: 'in <string>' requires string as left operand, not set
查看我答案的更新部分。这是你想做的吗?
是的,它很完美 :) 谢谢你,for .... in ...
:允许你以某种方式转换/声明你想要的数据吗?
for .... in ... 是一个 for 循环,参考:w3schools.com/python/python_for_loops.asp以上是关于从抓取bs4中过滤python中的数据的主要内容,如果未能解决你的问题,请参考以下文章