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

2024-06-17 11:02:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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?组织id=418

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

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

我想听听你的建议。我想我想1)如果href以“/game/”开头,我想有一个更好的方法来获取该href,而不是用引号(可能是正则表达式?)拆分。2) 如果href以“/team/”开头,我希望能够创建一个字典,将费城与之配对(3-1)。如有任何建议或意见,将不胜感激。你知道吗


Tags: inidgameforindexhtmlfind团队
2条回答

要获取所有以/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']

至于第二个,您可以使用regex,但是在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+)\)将提取括号内的数字+-+数字。如果不存在此值,则会将键值与找到的键一起添加,但会添加一个空值。你知道吗

您可以使用CSS选择器来匹配以特定字符串开头的标记属性:例如soup.select('a[href^="/game/"]')将匹配以/game/开头的attribute href的所有<a>标记。你知道吗

对于第二部分,您可以使用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)'}

相关问题 更多 >