我有以下内容:
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 许可协议
您的 html 中的“a”标签没有直接包含任何文本,但它包含一个包含文本的“h3”标签。这意味着
text
是 None,并且.find_all()
无法选择标签。如果标签包含除文本内容以外的任何其他 html 元素,一般不要使用text
参数。如果您仅使用标记的名称(以及
href
关键字参数)来选择元素,则可以解决此问题。然后在循环中添加一个条件来检查它们是否包含文本。或者,如果您更喜欢单行代码,则可以使用列表推导式。
或者您可以将
lambda
传递给.find_all()
。如果您想收集所有链接,无论它们是否有文本,只需选择所有具有“href”属性的“a”标签。锚标记通常有链接,但这不是必需的,所以我认为最好使用
href
参数。使用
.find_all()
。使用
.select()
和 CSS 选择器。