使用bs4查找特定链接文本
我正在尝试从一个网站上提取信息,想找到所有的标题。现在我遇到的问题是,无法获取我需要的标签的文本。下面是一个html的例子。
<td class="m" id="b1"><a href="/QSYcfT" id="c1" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=BFNH-6K10Ic', 'QSYcfT', this.id); this.blur(); return false;">TF4 - Oreos</a> <a href="#" onClick="return lkP('1', 'QSYcfT');" id="x1"><font class="bp">(0)</font></a>
<td class="m" id="b2"><a href="/zXHNvp" id="c2" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=0vjcGwZGBYI', 'zXHNvp', this.id); this.blur(); return false;">Awesome Game Boy Facts</a> <a href="#" onClick="return lkP('2', 'zXHNvp');" id="x2"><font class="bp">(0)</font></a>
我想获取每个id为
我的输出应该是这样的。
TF4 - Oreos
Awesome Game Boy Facts
到目前为止,我尝试过。
soup = bs4.BeautifulSoup(html)
links = soup.find_all('a',{'id' : 'c'})
for link in links:
print link.text
但是它什么都没有找到,也没有打印出来?
3 个回答
2
你可以在调用 find_all()
的时候,传入一个 正则表达式 对象。
import re
import bs4
html = '''
<td class="m" id="b1"><a href="/QSYcfT" id="c1" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=BFNH-6K10Ic', 'QSYcfT', this.id); this.blur(); return false;">TF4 - Oreos</a> <a href="#" onClick="return lkP('1', 'QSYcfT');" id="x1"><font class="bp">(0)</font></a>
<td class="m" id="b2"><a href="/zXHNvp" id="c2" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=0vjcGwZGBYI', 'zXHNvp', this.id); this.blur(); return false;">Awesome Game Boy Facts</a> <a href="#" onClick="return lkP('2', 'zXHNvp');" id="x2"><font class="bp">(0)</font></a>
'''
soup = bs4.BeautifulSoup(html)
for links in soup.find_all('a', {'id' : re.compile('^c') }):
print ''.join(links.find_all(text=True))
输出结果
TF4 - Oreos
Awesome Game Boy Facts
2
没有带有属性 c
的 a
标签,但有 c1
和 c2
。
links = soup.find_all('a',{'id' : 'c1'})
如果你想找到所有属性以 c
开头的 a
标签,你需要使用正则表达式:
import re
links = soup.findAll('a', {'id': re.compile('^c')})
3
你可以在属性值的位置使用正则表达式:
links = soup.find_all('a', {'id': re.compile('^c\d+')})
^
表示字符串的开头,\d+
匹配一个或多个数字。
示例:
>>> import re
>>> from bs4 import BeautifulSoup
>>>
>>> html = """
... <tr>
... <td class="m" id="b1"><a href="/QSYcfT" id="c1" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=BFNH-6K10Ic', 'QSYcfT', this.id); this.blur(); return false;">TF4 - Oreos</a> <a href="#" onClick="return lkP('1', 'QSYcfT');" id="x1"><font class="bp">(0)</font></a></td>
... <td class="m" id="b2"><a href="/zXHNvp" id="c2" target="_blank" onClick="vPI('https://www.youtube.com/watch?v=0vjcGwZGBYI', 'zXHNvp', this.id); this.blur(); return false;">Awesome Game Boy Facts</a> <a href="#" onClick="return lkP('2', 'zXHNvp');" id="x2"><font class="bp">(0)</font></a></td>
... </tr>
... """
>>> soup = BeautifulSoup(html)
>>> links = soup.find_all('a', {'id': re.compile('^c\d+')})
>>> for link in links:
... print link.text
...
TF4 - Oreos
Awesome Game Boy Facts