要抓取的网站具有不同的类别名称

时间:2019-03-16 17:25:12

标签: python web-scraping beautifulsoup

我正在尝试抓取产品的标题和价格。我遇到的问题是网站上的课程有所不同。这是一个例子,

<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解析器,如果有帮助的话。谢谢您的宝贵时间。

3 个答案:

答案 0 :(得分:2)

BeautifulSoup允许您使用regex as the filter。在您的站点中,a标记的类名称中包含-ab

您可以使用

soup.find_all('a',class_=re.compile("-ab"))

但是在某些情况下,类名中不需要任何通用术语,您可以检查是否可以尝试使用 Going back and forthGoing sidewaysGoing downGoing 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']")