223

我正在寻找一个用于 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>

那么它应该给我一种通过 HTML 标签的名称或 id 访问嵌套标签的方法,这样我基本上可以要求它获取div标签中class='container'包含在body标签中的内容/文本,或类似的东西。

如果您使用过 Firefox 的“检查元素”功能(查看 HTML),您会知道它以一种像树一样的嵌套方式为您提供所有标签。

我更喜欢内置模块,但这可能要求太多了。


我在 Stack Overflow 和互联网上的一些博客上遇到了很多问题,其中大多数都建议 BeautifulSoup 或 lxml 或 HTMLParser,但其中很少有详细说明功能,并且只是作为关于哪个更快/更有效的争论而结束。

4

7 回答 7

247

这样我就可以要求它获取 div 标记中的内容/文本,其中 class='container' 包含在 body 标记中,或者类似的东西。

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)

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

于 2012-07-29T12:12:15.873 回答
101

我猜你正在寻找的是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()

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

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

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

pq('div#mw-head.noprint')
于 2012-07-29T12:47:39.553 回答
44

在这里,您可以阅读更多关于 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
于 2012-07-29T12:07:25.860 回答
31

与其他解析器库相比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'))

lxml.html 文档

于 2014-11-08T01:08:26.443 回答
9

我推荐使用lxml来解析 HTML。请参阅“解析 HTML”(在 lxml 站点上)。

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

于 2014-10-25T18:50:16.673 回答
2

我建议使用justext库:

https://github.com/miso-belica/jusText

用法: Python2:

import requests
import justext

response = requests.get("http://planet.python.org/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print paragraph.text

Python3:

import requests
import justext

response = requests.get("http://bbc.com/")
paragraphs = justext.justext(response.content, justext.get_stoplist("English"))
for paragraph in paragraphs:
    print (paragraph.text)
于 2016-07-15T15:51:02.857 回答
0

我会使用 EHP

https://github.com/iogf/ehp

这里是:

from ehp import *

doc = '''<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>Something here</div>
        <div>Something else</div>
    </div>
</body>
</html>
'''

html = Html()
dom = html.feed(doc)
for ind in dom.find('div', ('class', 'container')):
    print ind.text()

输出:

Something here
Something else
于 2016-03-20T09:44:48.863 回答