2014-12-20 89 views
2

查找文本我有屏幕抓取在Python代碼的一點點,使用BeautifulSoup,那就是讓我頭疼。對html的一個小改動使我的代碼中斷了,但是我看不出爲什麼它不起作用。這是基本的解析時,HTML如何看一個演示:find_all不混合內容

soup=BeautifulSoup(""" 
<td> 
    <a href="https://alink.com"> 
     Foo Some text Bar 
    </a> 
</td> 
""") 
links = soup.find_all('a',text=re.compile('Some text')) 
links[0]['href'] # => "https://alink.com" 

升級後,該標籤的身體現在包括一個img標籤,這使得代碼休息。

<td> 
    <a href="https://alink.com"> 
     <img src="dummy.gif" > 
     Foo Some text Bar 
    </a> 
</td> 

'links'現在是一個空列表,所以正則表達式找不到任何東西。 我砍死它周圍由單獨的文本匹配,然後找到 其母公司,但似乎更脆弱:

links = soup.find_all(text=re.compile('Some text')) 
links[0].parent['href'] # => "https://alink.com" 

什麼是另外一個img標籤作爲同級的文字 內容突破搜索由BeautifulSoup做的,是有 修改第一代碼工作的一種方式?

+1

爲什麼不'下一個(鏈接[ 「HREF」]在soup.find_all(鏈接 'A'),如果 「一些文本」 在link.text)' –

+0

似乎罰款。 next()調用是做什麼的? – oligofren

+1

剛剛返回,這將是該行爲實際上竟然是圖書館具體你要 –

回答

0

第一個示例僅a.stringNone即,當且僅當該文本是獨生子女。

作爲一種變通方法,您可以使用函數謂詞:

a = soup.find(lambda tag: tag.name == 'a' and tag.has_attr('href') and 'Some text' in tag.text) 
print(a['href']) 
# -> 'https://alink.com' 
1

不同的是,第二個例子有一個不完整的img標籤:

它應該是

<img src="dummy.gif" /> 
Foo Some text Bar 

<img src="dummy.gif" > </img> 
Foo Some text Bar 

相反,它被解析爲

<img src="dummy.gif" > 
Foo Some text Bar 
</img> 

於是找到該元素,是不是a任何時間較長,但img,其母公司是a

+0

該鏈接的第一場比賽。我有一些解析代碼與我的Mac上的Python發行版一起工作,但它不適用於我的Linux發行版。不完整的img標籤在一個運行時被認爲是父代,但不是另一個,它被認爲是兄弟姐妹。得愛它。 – oligofren