python - 要抓取的网站具有不同的类名
问题描述
我正在尝试抓取产品的标题和价格。我面临的问题是网站的课程有所不同。这是一个例子,
<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 解析器,如果这有帮助的话。感谢您的时间。
解决方案
BeautifulSoup 允许您使用正则表达式作为过滤器。a
在您的站点中,标签的类名包含-ab
在其中。
您可以使用
soup.find_all('a',class_=re.compile("-ab"))
但在某些情况下,类名中不需要任何通用术语,您可以检查是否可以尝试使用文档中的 Going back and going 、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
都被选中。
推荐阅读
- swift - 一个本地通知是否可以有两个 DateCompontents?
- node.js - BulkWrite to Collection 导致超时错误,但在写入空测试 Collection 时有效
- javascript - 为什么我的文件在 HTTP 响应中被放大了?
- python - 从 python CRFSuite 获取混淆矩阵的最简单方法是什么?
- python - 在 python web 应用程序中获取传入的电话号码
- amazon-web-services - 在 64 位 Amazon Linux 2/3.2.2 和 Dockerrun.aws.json v3 上运行 Docker 的 Elastic Beanstalk
- amazon-sqs - SQS Event Bridge Once Per Minute
- c++ - 将标准输出重定向到管道,然后从中读取不同长度的整数
- python - 如何在单个文件中读取多个 JSON 对象?
- r - 由于有问题的文本字符串,无法打开导出的 Excel 文件