[英]Parsing HTML with Beautiful Soup
我有一個元組定義了我對給定頁面感興趣的鏈接關鍵字,所以:
categories = ('car', 'planes', ...)
我試圖進入一個列表,列出給定類中與我的類別元組的任何值匹配的所有鏈接。 該文件如下:
<div class='content'>
<ul class='side-panel'>
<li><a href='page1.html'>page 1</a></li>
<li><a href='page2.html'>page 2</a></li>
<li><a href='best_car_2013.html'>Best Cars</a></li>
...
</ul>
</div>
現在我在做:
found = []
for link in soup.find_all(class_='side-panel'):
for category in categories:
if re.search(category, link.get('href')):
found.append(link)
我得到一個類型錯誤“期望的字符串或緩沖區”。 調試腳本,我知道我正在使用各自的錨標簽獲得所有'li',但是我無法迭代所有這些結果集以獲得與列表中的元組匹配的每個鏈接的'href'。
每當您發現自己手動迭代標記以進行一些額外的過濾時,通常最好只使用bs4
API。 在這種情況下,您可以將正則表達式傳遞給find_all
。
soup.find(class_='side-panel').find_all(href=re.compile('|'.join(categories)))
Out[86]: [<a href="best_car_2013.html">Best Cars</a>]
如果還不清楚,加入categories
與管道成一個表達讓re
引擎決定,如果任一類別匹配href屬性。 這將替換顯式循環每個類別並單獨進行re
搜索。
編輯 :(參考注釋中的鏈接)看起來你正在抓取的頁面有兩個 class='side-panel categories'
標簽(???)所以在初始find_all
操作上執行更多find_all
操作的循環可能是合適的:
[t for tags in soup.find_all(class_='side-panel categories')
for t in tags.find_all(href=re.compile('|'.join(selected_links)))]
Out[24]:
[<a href="/animals__birds-desktop-wallpapers.html">Animals & Birds</a>,
<a href="/beach-desktop-wallpapers.html">Beach</a>,
<a href="/bikes__motorcycles-desktop-wallpapers.html">Bikes</a>,
<a href="/cars-desktop-wallpapers.html">Cars</a>,
<a href="/digital_universe-desktop-wallpapers.html">Digital Universe</a>,
<a href="/flowers-desktop-wallpapers.html">Flowers</a>,
<a href="/nature__landscape-desktop-wallpapers.html">Nature</a>,
<a href="/planes-desktop-wallpapers.html">Planes</a>,
<a href="/travel__world-desktop-wallpapers.html">Travel & World</a>,
<a href="/vector__designs-desktop-wallpapers.html">Vector & Designs</a>]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.