2014-12-20 44 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