Python BeautifulSoup:如何获取“a”元素的“href”属性?

新手上路,请多包涵

我有以下内容:

   html =
  '''<div class=“file-one”>
    <a href=“/file-one/additional” class=“file-link">
      <h3 class=“file-name”>File One</h3>
    </a>
    <div class=“location”>
      Down
    </div>
  </div>'''

并且只想获取 href 的文本,即 /file-one/additional 。所以我做了:

 from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')

link_text = “”

for a in soup.find_all(‘a’, href=True, text=True):
    link_text = a[‘href’]

print “Link: “ + link_text

但它只是打印一个空白,什么也没有。只是 Link: 。所以我在另一个网站上测试了它,但使用了不同的 HTML,并且它有效。

我做错了什么?还是该站点有意编程为不返回 href 的可能性?

预先感谢您,一定会投票/接受答案!

原文由 user3259472 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
1 个回答

您的 html 中的“a”标签没有直接包含任何文本,但它包含一个包含文本的“h3”标签。这意味着 text 是 None,并且 .find_all() 无法选择标签。如果标签包含除文本内容以外的任何其他 html 元素,一般不要使用 text 参数。

如果您仅使用标记的名称(以及 href 关键字参数)来选择元素,则可以解决此问题。然后在循环中添加一个条件来检查它们是否包含文本。

 soup = BeautifulSoup(html, 'html.parser')
links_with_text = []
for a in soup.find_all('a', href=True):
    if a.text:
        links_with_text.append(a['href'])

或者,如果您更喜欢单行代码,则可以使用列表推导式。

 links_with_text = [a['href'] for a in soup.find_all('a', href=True) if a.text]

或者您可以将 lambda 传递给 .find_all()

 tags = soup.find_all(lambda tag: tag.name == 'a' and tag.get('href') and tag.text)


如果您想收集所有链接,无论它们是否有文本,只需选择所有具有“href”属性的“a”标签。锚标记通常有链接,但这不是必需的,所以我认为最好使用 href 参数。

使用 .find_all()

 links = [a['href'] for a in soup.find_all('a', href=True)]

使用 .select() 和 CSS 选择器。

 links = [a['href'] for a in soup.select('a[href]')]

原文由 t.m.adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题