基于正则表达式搜索范围的美丽汤

时间:2017-08-27 10:05:30

标签: python beautifulsoup

我有一个可怕的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())

使用正则表达式进行搜索的最佳方式是什么?

1 个答案:

答案 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 - 这样我们就可以将它们过滤掉。