我有一个可怕的html页面,我需要解析。
我正在寻找H2标题 - 我已经设法了。我还需要搜索股票和股票订单。最后两个字段在SPANS中保存。我不能单独使用class:info,因为我需要忽略这个类的许多其他字段。我认为实现这一目标的唯一方法是使用正则表达式搜索范围。
以下是一些示例HTML - 请注意我删除了许多我不感兴趣的HTML ...
..
..
<div class="innerListing">
..
..
<div class="title">
<a id="btl00_ContentPlaceHolder105" href="http://****"><h2 id="btl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_advertTitleWrapper" title="TitleText">
TitleText</h2></a>
<p class="sku">
</p>
</div>
...
<div class="layout">
<span id="btl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_ProductTypeLabel" class="label">Product Type:</span><span id="ctl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_ProductType" class="info">3 seat sofa</span>
...
<span id="btl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_StockLabel" class="label">Stock:</span><span id="ctl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_Stock" class="info">5</span>
...
<span id="btl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_StockOnOrderLabel" class="label">On Order:</span><span id="ctl00_ContentPlaceHolder1_Ctrl_SearchResultsWrapper_ctl05_Stockonorder" class="info">1</span>
</div>
到目前为止,这是我的代码。它的工作原理,但如上所述我得到的数据太多,即所有的类='信息'。我只需要Stock&amp; SockOnOrder
soup = BeautifulSoup(source_code, "lxml")
#For Title
for header in soup.find_all("div", attrs={'class':'innerListing'}):
title = header.find("h2")
print (title.text.strip())
#For Spans
for layout in soup.find_all("div", attrs={'class':'layout'}):
for info in layout.find_all("span", attrs={'class':'info'}):
print (info.text.strip())
使用正则表达式进行搜索的最佳方式是什么?
答案 0 :(得分:1)
如果我正确理解您的问题,您是否只想要span
属性中Stock
的所有id
?
如果是这样,您可以更改第二个for
循环并忽略与Stock / StockonOrder无关的循环:
#For Spans
for layout in soup.find_all("div", attrs={'class':'layout'}):
for info in layout.find_all("span", attrs={'class':'info', "id":True}):
if "Stock" in info["id"]:
print (info.text.strip())
注意:您需要在find_all
调用("id":True
)中添加额外属性,以避免任何KeyErrors。这是为了防止有一些span标签没有任何ID - 这样我们就可以将它们过滤掉。