首页 > 解决方案 > 要抓取的网站具有不同的类名

问题描述

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

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

标签: pythonweb-scrapingbeautifulsoup

解决方案


BeautifulSoup 允许您使用正则表达式作为过滤器a在您的站点中,标签的类名包含-ab在其中。

您可以使用

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

但在某些情况下,类名中不需要任何通用术语,您可以检查是否可以尝试使用文档中的 Going back and goingGoing 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都被选中。


推荐阅读