我试图刮掉产品的标题和价格。我遇到的问题是网站的课程有所不同。这是一个例子,
<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解析器,如果这将有任何帮助。感谢您的时间。
是的@Bitto提到的是正确的。你使用正则表达式来识别独特的元素。使用re
你可以实现这一点。但是这里是你的代码。你可以使用pandas 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 ...
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
标签。
您可以使用带有$运算符的结尾的attribute = value选择器
items = soup.select("a[class$='-ab']")