【问题标题】:BeautifulSoup cannot parse the html tags which don't have closing elementBeautifulSoup 无法解析没有结束元素的 html 标签
【发布时间】:2019-04-09 05:05:01
【问题描述】:

这是我正在编写的 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>

我想获取包含标签“&lt;meta name = description”的行,它没有关闭元素&lt;/meta&gt;。有我的代码

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>

但是如果“&lt;meta content="sdddsdsdsdsdsd" name="description"&gt;”有接近元素&lt;/meta&gt;,我可以得到准确的线:

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

你想告诉我为什么 BeautifulSoup 得到所有 HTML 标签在 &lt;meta name = description 下的原因,以及如何获取包含 &lt;meta name = description 的行

谢谢。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    使用lxml 模块作为parser 可以工作,我已经测试过了。

    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"/>
    

    【讨论】:

    • 感谢披萨!有用。只是想问一下BeautifulSoup为什么显示不正确的结果-是Beautiful的问题吗?
    • @LittleChicken 是的,只是 BeautifulSoup 标准解析器不如 lxml 中的正则表达式解析器强大。如果您发现答案是正确的,那么您可以将其标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2020-06-22
    • 2017-10-30
    • 1970-01-01
    • 2014-12-10
    • 2021-01-18
    相关资源
    最近更新 更多