我正在尝试抓取产品的标题和价格。我遇到的问题是网站上的课程有所不同。这是一个例子,
<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
当我使用另一台计算机时,它会显示为
<a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
我意识到他们将班级改为随机字母。 我目前正在使用BeautifulSoup4和请求库。 除了制作整个较长的“ if-elif”课程外,还有什么方法可以上课? 我要抓取的网站是carousell.com 我目前正在使用lxml解析器,如果有帮助的话。谢谢您的宝贵时间。
答案 0 :(得分:2)
BeautifulSoup允许您使用regex as the filter。在您的站点中,a
标记的类名称中包含-ab
。
您可以使用
soup.find_all('a',class_=re.compile("-ab"))
但是在某些情况下,类名中不需要任何通用术语,您可以检查是否可以尝试使用 Going back and forth ,Going sideways,Going down和Going up部分,以某种方式唯一标识所需的元素,而无需依赖类名。
回到您的问题
html="""
<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
<a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>
"""
from bs4 import BeautifulSoup
import re
soup=BeautifulSoup(html,'html.parser')
a_links=soup.find_all('a',class_=re.compile("-ab"))
print(a_links)
输出:
[<a class="G-ab" href="thewebsite.com"><div class="G-l"><div class="G-m">Product Name</div></div><div class="G-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>, <a class="K-ab" href="thewebsite.com"><div class="K-l"><div class="K-m">Product Name</div></div><div class="K-k"><div>S$230</div><div>Product Description</div><div>Used</div></div></a>]
同时选择了具有不同类名的a
标签,其中包含-ab
。
答案 1 :(得分:1)
是的,@ Bitto所提到的是正确的。您已经使用正则表达式来标识唯一元素。使用re
可以实现这一点。但是这里是您的代码。您可以使用熊猫Dataframe
打印结果。
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd
html=requests.get("https://carousell.com/search/products/?cc_id=2195&query=I7&sort_by=time_created%2Cdescending")
soup=BeautifulSoup(html.text,"html.parser")
atag=soup.find_all('a', class_=re.compile("-ab"))
itemtitle=[]
itemprice=[]
for a in atag:
for title,price in zip(a.find_all('div', class_=re.compile("-m")),a.find_all('div', class_=re.compile("-k"))):
itemtitle.append(title.text)
itemprice.append(price.find('div').text)
df=pd.DataFrame({"Title" :itemtitle, "Price" : itemprice})
print(df)
输出:
Price Title
0 £200 Acer Aspire Laptop (Used)
1 £700 MSI GP62 LEOPARD i7 12gb Ram windows 10
2 £120 Apple MacBook Pro
3 £155 iPhone 7 Plus
4 £155 Goophone I7 Plus
5 £579 MacBook Air 13.3inch 2014 i7 1.7GHz 8GB Ram 12...
6 £550 MacBook Pro 2016 16GB Ram
7 £600 CUSTOM GAMING/MEDIA PC COMPUTER
8 £900 MS I GE62 2QF-419UK APACHE/PRO TRUE FIRE POWER
9 £390 HP Envy 15 Intel Core i7 4000MQ 12GB Ram
10 £188 Goophone I7 Plus
11 £650 Apple IMac 27" i7 2.8Ghz Quad Core
12 £600 Custom Gaming Pc (Excellent Condition)
13 £499 iMac 21.5inch with wireless keyboard
14 £1,299 MacBook Pro Retina 13 Inches AppleCare
15 £700 I7 4790k Water Cooled
16 £650 Gigabyte P15V2
17 £280 Two Monitors i7 PC
18 £250 Gaming laptop pro
19 £1,000 MAC BOOK PRO 15 Ritna
20 £550 Apple MacBook Pro Laptop - A1286 15.2" 500 GB ...
答案 2 :(得分:1)
您可以使用以$运算符结尾的attribute =值选择器
items = soup.select("a[class$='-ab']")