如何将 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 的<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)'
【讨论】:
以上是关于如何将 BeautifulSoup HREF 搜索从 <a> 扩展到 <td>的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Python中的BeautifulSoup从HTML链接解析嵌套表?