我从 Python 和 BeautifulSoup 开始。我想用 BS 抓取一个网站,但我不理解我的代码结果以及 find
和 find_all
的使用。我想在 href
标签中获取一个 URL。
<div class="xBRiJc">
<a href="https://play.google.com/store/apps/collection/cluster?
clp=igNLChkKEzc4NDcxODQ2MTE5MjkxMDc4NTgQCBgDEiwKJmFhZGVtby5zdXBlcmF3ZXNvbWUudHYuYXdlc29tZWFkc2RlbW8yEAEYAxgB:S:ANO1ljKZ36s&gsr=Ck6KA0sKGQoTNzg0NzE4NDYxMTkyOTEwNzg1OBAIGAMSLAomYWFkZW1vLnN1cGVyYXdlc29tZS50di5hd2Vzb21lYWRzZGVtbzIQARgDGAE%3D:S:ANO1ljKKOPI"> .
<h2 class="C7Bf8e bs3Xnd">SuperAwesome LTD</h2></a></div>
这是我的 python 代码:
developer_link = bs.find("div",{"class":"xBRiJc"})
print(developer_link.get('href'))
为什么我的 print
命令的结果是“无”,而不是 href
标记中的 URL?
最佳答案
您正在定义 developer_link
成为<div>
包含链接的标签,而不是链接本身。由于 div 标签本身没有“href”参数,developer_link.get('href')
将返回 None
.所以你只需要更进一步:
>>> pagecode = """
... <div class="xBRiJc">
... ... <a href="https://play.google.com/store/apps/collection/cluster?
... ... clp=igNLChkKEzc4NDcxODQ2MTE5MjkxMDc4NTgQCBgDEiwKJmFhZGVtby5zdXBlcmF3ZXNvbWUudHYuYXdlc29tZWFkc2RlbW8yEAEYAxgB:S:ANO1ljKZ36s&gsr=Ck6KA0sKGQoTNzg0NzE4NDYxMTkyOTEwNzg1OBAIGAMSLAomYWFkZW1vLnN1cGVyYXdlc29tZS50di5hd2Vzb21lYWRzZGVtbzIQARgDGAE%3D:S:ANO1ljKKOPI"> .
... ... <h2 class="C7Bf8e bs3Xnd">SuperAwesome LTD</h2></a></div>
... ... """
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(pagecode, 'lxml')
>>> div = soup.find("div", class_="xBRiJc")
>>> link = div.find("a")
>>> print(link.get('href'))
https://play.google.com/store/apps/collection/cluster?
... clp=igNLChkKEzc4NDcxODQ2MTE5MjkxMDc4NTgQCBgDEiwKJmFhZGVtby5zdXBlcmF3ZXNvbWUudHYuYXdlc29tZWFkc2RlbW8yEAEYAxgB:S:ANO1ljKZ36s&gsr=Ck6KA0sKGQoTNzg0NzE4NDYxMTkyOTEwNzg1OBAIGAMSLAomYWFkZW1vLnN1cGVyYXdlc29tZS50di5hd2Vzb21lYWRzZGVtbzIQARgDGAE%3D:S:ANO1ljKKOPI
虽然看这个例子,我猜 div 的类是动态生成的。如果是这样,那么当您重新访问该页面时,div 的类可能不是“xBRiJc”,这意味着它不是链接的可靠标识符。如果您只是想获取文本包含“SuperAwesome LTD”的第一个链接,您可以使用一些正则表达式技巧来获取仅基于 tht 的链接。但是如果你知道你的链接直接有一个 H2 标签,它的实际文本是“SuperAwesome LTD”,那么你可以这样做:
t = soup.find('h2')
print(t.parent.get('href'))
关于python - 使用 Beautiful Soup 解析时的“无”属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53381699/