如何将 BeautifulSoup HREF 搜索从 <a> 扩展到 <td>

Posted

技术标签:

【中文标题】如何将 BeautifulSoup HREF 搜索从 <a> 扩展到 <td>【英文标题】:How to expand BeautifulSoup HREF search from <a> to <td> 【发布时间】:2019-01-29 03:59:48 【问题描述】:

我正在尝试在 html 中查找某些 href,并且我一直在使用(一直在工作):

for a in soup.find_all('a', href=True):
    if a['href'].startswith('/game/'):
        chunk = str(a).split('''"''')
        game = chunk[3]

对于以下 HTML:

<td colspan="4">
    <a href="/game/index/4599712?org id=418" class="skipMask" target="TEAM_WIN">35-28 </a>
</td>

我的代码成功地给了我 /game/index/4599712?org id=418

但是,还有其他标签具有团队的单独 href 和团队的记录。示例:

<td nowrap bgcolor="#FFFFFF">
    <a href="/team/145/18741">Philadelphia</a> == $0
    " (3-1)                                     "
</td>

我想对此提出一些建议。我想我想 1)如果 href 以“/game/”开头,id 喜欢有一个更好的方法来获取那个 href,而不是用引号分割(可能是正则表达式?)。 2)如果href以“/team/”开头,我希望能够创建一个字典来将Philadelphia与(3-1)配对。任何建议或想法将不胜感激。

【问题讨论】:

您可以直接通过 API 获取属性值,就像您在 a['href'] 中所做的那样。 【参考方案1】:

要获取所有以/game/ 开头的href,只需将找到的节点href 值附加到列表中:

>>> result1 = []
>>> for a in soup.find_all('a', href=True):
    if a['href'].startswith('/game/'):
        result1.append(a['href'])

>>> print(result1)
['/game/index/4599712?org id=418']

至于第二个,您可以使用正则表达式,但在a 的下一个兄弟的纯文本上:

>>> import re
>>> result2 = 
>>> for a in soup.find_all('a', href=True):
    if a['href'].startswith('/team/'):
        m = re.search(r"\((\d+-\d+)\)", a.next_sibling.string)
        if m:
            result2[a.string] = m.group(1)
        else:
            result2[a.string] = ""

>>> print(result2)
'Philadelphia': '3-1'

\((\d+-\d+)\) 将提取数字 + - + 括号内的数字。如果此值不存在,则将使用找到的键添加键值,但为空值。

【讨论】:

【参考方案2】:

您可以使用 CSS 选择器来匹配以特定字符串开头的标签属性:例如soup.select('a[href^="/game/"]') 将匹配所有带有以/game/ 开头的属性href 的&lt;a&gt; 标签。

第二部分可以使用re模块:

from bs4 import BeautifulSoup
import re

data = '''
<td colspan="4">
    <a href="/game/index/4599712?org id=418" class="skipMask" target="TEAM_WIN">35-28 </a>
</td>
<td nowrap bgcolor="#FFFFFF">
    <a href="/team/145/18741">Philadelphia</a> == $0
    " (3-1)                                     "
</td>
'''

soup = BeautifulSoup(data, 'lxml')

for a in soup.select('a[href^="/game/"]'):
  print(a['href'])

for a in soup.select('a[href^="/team/"]'):
    m = re.findall(r'\s*(.*?)(?=\s*==).*?(\(.*?\))', a.parent.text, flags=re.DOTALL)
    if m:
        print(dict(m))

打印:

/game/index/4599712?org id=418
'Philadelphia': '(3-1)'

【讨论】:

以上是关于如何将 BeautifulSoup HREF 搜索从 <a> 扩展到 <td>的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Python中的BeautifulSoup从HTML链接解析嵌套表?

如何使用 Beautiful Soup 获取锚标签的 href?

python--BeautifulSoup

python爬虫之beautifulsoup的使用

beautifulsoup 对象如何能够将标签作为属性?

python3解析库BeautifulSoup4