【问题标题】:Find specific link text with bs4使用 bs4 查找特定链接文本
【发布时间】:2014-07-08 20:56:14
【问题描述】:

我正在尝试抓取网站并查找提要的所有标题。我无法获取我需要的 a 标签的文本。这是一个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 为 c 的每个 a 标记的文本并将每个标记打印在新行上。

我的输出应该是这样的。

TF4 - Oreos
Awesome Game Boy Facts

到目前为止我已经尝试过了。

soup = bs4.BeautifulSoup(html)
links = soup.find_all('a',{'id' : 'c'})
for link in links:
    print link.text

但它没有找到或打印任何东西?

【问题讨论】:

  • 如果可以的话,我会接受所有这些有效的答案和回复。

标签: python html web-scraping beautifulsoup


【解决方案1】:

您可以pass a regular expression 代替属性值:

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

【讨论】:

    【解决方案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】:

      您可以在调用中将regular expression 对象传递给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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 2021-09-18
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多