BeautifulSoup 4:处理包含<br/>的网址

时间:2014-08-08 23:44:52

标签: python html beautifulsoup

我正在处理与beautifulsoup 4.3.2的html / xhtml链接,并且在元素中遇到了一些奇怪的事情。

from bs4 import BeautifulSoup

html = BeautifulSoup('<html><head></head><body><a href="/track?no=ABCD0000000">ABCD0000000<br /></a></body></html>')
html.find_all('a', text=re.compile('ABCD0000000', re.IGNORECASE))

给出一个空列表。

正如我发现的那样,它是由标签中出现的br标签引起的。 嗯。好吧,让我们用这里建议的换行符替换它。

html.find('br').replaceWith('\n')
html.find_all('a', text=re.compile('ABCD0000000', re.IGNORECASE))

再次列出一个empy列表,该死的。

可能,

html.find('br').replaceWith('')
html.find_all('a', text=re.compile('ABCD0000000', re.IGNORECASE))

同样的结果..

但是

html = BeautifulSoup('<html><head></head><body><a href="/track?no=ABCD0000000">ABCD0000000</a></body></html>')
html.find_all('a', text=re.compile('ABCD0000000', re.IGNORECASE))

[<a href="/track?no=ABCD0000000">ABCD0000000</a>]

- 工作正常。

所以,正如我所看到的,除了在将数据提供给bs4之前清理或替换br之外,没有办法绕过这个。

import re
re.sub(re.compile('<br\s*/>', re.IGNORECASE), '\n', '<html><head></head><body><a href="/track?no=ABCD0000000">ABCD0000000<br /></a></body></html>')

还是其他?

感谢您的建议和补充。

祝你好运,  〜S上。

1 个答案:

答案 0 :(得分:2)

一种选择是使用extract()删除所有br代码,然后执行搜索:

import re
from bs4 import BeautifulSoup

html = BeautifulSoup('<html><head></head><body><a href="/track?no=ABCD0000000">ABCD0000000<br /></a></body></html>')

for br in html('br'):
    br.extract()

print html.find_all('a', text=re.compile('ABCD0000000', re.IGNORECASE))

打印:

[<a href="/track?no=ABCD0000000">ABCD0000000</a>]

另一种选择是使用CSS Selector检查href属性是否以ABCD0000000结尾:

html.select('a[href$="ABCD0000000"]')

另一种选择是使用a function并检查链接文字是否以ABCD0000000开头:

html.find_all(lambda tag: tag.name == 'a' and tag.text.startswith('ABCD0000000'))