使用Python解析HTML

ffl*_*ing 166 python html-parsing xml-parsing

我正在寻找一个用于Python的HTML Parser模块,它可以帮助我以Python列表/字典/对象的形式获取标签.

如果我有一份表格的文件:

<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后它应该给我一种方法来通过HTML标签的名称或ID访问嵌套标签,这样我基本上可以让它给我div标签中class='container'包含的body标签中的内容/文本,或类似的东西.

如果您使用过Firefox的"Inspect element"功能(查看HTML),您就会知道它以一种漂亮的嵌套方式为您提供所有标记,就像树一样.

我更喜欢内置模块,但可能会有点太多.


我在Stack Overflow和互联网上的一些博客上经历了很多问题,其中大多数都建议使用BeautifulSoup或lxml或HTMLParser,但其中很少有人详细介绍了这些功能,最后只是讨论哪一个更快/更有效.

Aad*_*aam 177

所以我基本上可以要求它在div标签中获取内容/文本,其中包含body标签中包含的class ='container',或类似的东西.

try: 
    from BeautifulSoup import BeautifulSoup
except ImportError:
    from bs4 import BeautifulSoup
html = #the HTML code you've written above
parsed_html = BeautifulSoup(html)
print(parsed_html.body.find('div', attrs={'class':'container'}).text)
Run Code Online (Sandbox Code Playgroud)

我猜你不需要性能描述 - 只需阅读BeautifulSoup的工作原理.看看它的官方文档.

  • 只是一个更新:从BeautifulSoup 4开始,导入行现在是`来自bs4 import BeautifulSoup` (16认同)
  • @Nathan 公平地说,主要版本更新意味着主要的不兼容更改,因此代码很可能会以一种或另一种方式破坏。早断总比晚断好。 (3认同)
  • parsed_html对象究竟是什么? (2认同)
  • parsed_html 是一个 BeautifulSoup 对象,可以将其视为 DOMElement 或 DOMDocument,除了它具有“棘手”属性,例如“body”将引用第一个(在本例中)的 BeautifulSoup 对象(记住,它基本上是一个树节点) , only) 根元素的 body 元素(在我们的例子中是 html) (2认同)
  • 一般信息:如果性能至关重要,请更好地使用`lxml`库(请参阅下面的答案).使用`cssselect`它非常有用,性能通常比其他可用库高10到100倍. (2认同)
  • `parsed_html = BeautifulSoup(html)` 对我不起作用,`parsed_html = BeautifulSoup(html, 'html.parser')` 可以 (2认同)
  • @BaileyParker,你可能会认为,在一群不断处理 python2、python3、c++11、c++17 Opencv 4.3 和 Java 2021 的人中,有人会想到将其命名为“import bs”所以当他们改变主意使用 bs5 时,他们不会再次破坏每个人的代码 (2认同)

Yus*_*shi 77

我想你要找的是pyquery:

pyquery:一个类似jquery的python库.

你想要的一个例子可能是:

from pyquery import PyQuery    
html = # Your HTML CODE
pq = PyQuery(html)
tag = pq('div#id') # or     tag = pq('div.class')
print tag.text()
Run Code Online (Sandbox Code Playgroud)

它使用与Firefox或Chrome的检查元素相同的选择器.例如:

元素选择器是'div#mw-head.noprint'

被检查的元素选择器是'div#mw-head.noprint'.所以在pyquery中,你只需要传递这个选择器:

pq('div#mw-head.noprint')
Run Code Online (Sandbox Code Playgroud)

  • 评论。该库在底层使用 [lxml](/sf/answers/1876881261/)。 (3认同)

Qia*_*iau 39

在这里,您可以阅读有关Python中不同HTML解析器及其性能的更多信息.即使文章有点过时,它仍然给你一个很好的概述.

Python HTML解析器性能

我推荐BeautifulSoup,即使它没有内置.只是因为它很容易处理这些任务.例如:

import urllib2
from BeautifulSoup import BeautifulSoup

page = urllib2.urlopen('http://www.google.com/')
soup = BeautifulSoup(page)

x = soup.body.find('div', attrs={'class' : 'container'}).text
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用BeautifulSoup4(最新版本):`来自bs4 import BeautifulSoup` (4认同)
  • 我正在寻找能够详细说明特性/功能而不是性能/效率的东西.编辑:对于早熟的答案,对不起,该链接实际上很好.谢谢. (2认同)

Len*_*oyt 26

与其他解析器库相比,lxml速度非常快:

而且使用cssselect它也非常容易用于抓取HTML页面:

from lxml.html import parse
doc = parse('http://www.google.com').getroot()
for div in doc.cssselect('a'):
    print '%s: %s' % (div.text_content(), div.get('href'))
Run Code Online (Sandbox Code Playgroud)

lxml.html文档

  • 我解析巨大的 HTML 来获取特定数据。使用 **BeautifulSoup** 执行此操作需要“1.7”秒,但应用 **lxml** 则将其速度提高了近“*100”倍!如果关心性能,**lxml** 是最好的选择 (2认同)

Lov*_*ell 9

我建议使用lxml解析HTML。请参阅“解析HTML”(在lxml网站上)。

以我的经验,Beautiful Soup将一些复杂的HTML弄乱了。我相信这是因为Beautiful Soup不是解析器,而是非常好的字符串分析器。

  • AIUI Beautiful Soup可以与大多数“后端” XML解析器一起使用,lxml似乎是受支持的解析器之一http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser (3认同)