BeautifulSoup无法解析没有闭合标签的HTML标签

0 投票
1 回答
1246 浏览
提问于 2025-04-18 08:35

这是我正在处理的HTML代码

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sdasdsadsad</title>
<link rel="alternate" media="only screen and (max-width: 640px)" href="local:80" />
<meta name="description" content="sdddsdsdsdsdsd">
<meta name="keywords" content="3333333333333333">
<meta property="og:title" content="444444444444444444444444">
<meta property="og:type" content="article">
<meta property="og:description" content="dsdsdsdsddsds">

</head>
<body></body>
</html>

我想找到包含标签 "<meta name = description" 的那一行,但这个标签没有关闭元素 </meta>。这是我的代码

import glob, os, re, urllib2, codecs
from bs4 import BeautifulSoup
from bs4 import SoupStrainer


html_doc = """
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sdasdsadsad</title>
<link rel="alternate" media="only screen and (max-width: 640px)" href="local:80" />
<meta name="description" content="sdddsdsdsdsdsd">
<meta name="keywords" content="3333333333333333">
<meta property="og:title" content="444444444444444444444444">
<meta property="og:type" content="article">
<meta property="og:description" content="dsdsdsdsddsds">

</head>
<body></body>
</html>
"""



soup = BeautifulSoup(html_doc)
aa = soup.find("meta", {"name":"description"})
print aa.encode("utf-8")

运行Python代码时,控制台显示

<meta content="sdddsdsdsdsdsd" name="description">
<meta content="3333333333333333" name="keywords">
<meta content="444444444444444444444444" property="og:title">
<meta content="article" property="og:type">
<meta content="dsdsdsdsddsds" property="og:description">
</meta></meta></meta></meta></meta>

但是如果 "<meta content="sdddsdsdsdsdsd" name="description">" 有关闭元素 </meta>,我就能准确找到那一行:

<meta content="sdddsdsdsdsdsd" name="description"> </meta>

你能告诉我为什么BeautifulSoup会获取所有在 <meta name = description 下的HTML标签吗?还有我该如何找到包含 <meta name = description 的那一行?

谢谢。

1 个回答

2

使用 lxml 模块作为 解析器,这样就可以正常工作,我已经测试过了。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_doc, 'lxml')
aa = soup.find("meta", {"name":"description"})

print aa.encode('utf-8')

# console output
<meta content="sdddsdsdsdsdsd" name="description"/>

撰写回答