我正在处理与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上。
答案 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'))