美丽汤返回<meta>过多的标签内容



基本上,我试图从一个带有bs4的站点获取所有元标签。

import urllib.request
from bs4 import BeautifulSoup
response = urllib.request.urlopen("https://grab.careers/").read()
response_decode = response.decode('utf-8')
soup = BeautifulSoup(response_decode,"html.parser")
metatags = soup.find_all('meta')
file = open('text.out','w')
for x in metatags:
file.write(str(x))
file.close()

我希望从上面的代码中只返回元标记。然而,汤返回元、链接和脚本内容,正如您从以下片段中看到的:

<meta content="Grab Careers | Working For A Better Southeast Asia" name="twitter:title" />
<meta content="Working For A Better Southeast Asia on Grab Careers�" name="twitter:description" />
<link href="https://grab.careers/" rel="canonical">
<script
type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","url":"https://grab.careers/","name":"Grab Careers","potentialAction":{"@type":"SearchAction","target":"https://grab.careers/search/{search_term_string}","query-input":"required name=search_term_string"}}</script>

我找不到任何资源来解决这个问题。如何修复此问题,以便只返回元标记。

老实说,我不能确切地弄清楚为什么会发生这种情况,但如果使用lxml而不是html.parser:,就可以解决这个问题

soup = BeautifulSoup(response_decode,"lxml")

需要安装lxml软件包,例如:pip install lxml

find_all方法提供一个标记及其所有子级。

我认为这是由于缺少空HTML标记的关闭/。像<meta charset="utf-8"/>一样正确闭合的meta标签(注意末尾的/(被解析为一个单独的标签。

而像<meta content="max-snippet:-1,max-image-preview:standard,max-video-preview:-1" name="robots">这样的元标签不被解析为闭合标签(由于缺少/(,并且因此包括所有标签,直到遇到闭合</meta>。这些children标记实际上包括您正在看到的链接和脚本标记。

最新更新