提问人:ffledgling 提问时间:7/29/2012 最后编辑:Benjamin Loisonffledgling 更新时间:2/18/2023 访问量:458103
使用 Python 解析 HTML
Parsing HTML using Python
问:
我正在寻找一个用于 Python 的 HTML 解析器模块,它可以帮助我以 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,但其中很少有详细介绍功能,只是以关于哪一个更快/更有效的争论结束。
答:
在这里,您可以阅读有关 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
评论
from bs4 import BeautifulSoup
这样我就可以要求它让我获得 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 的工作原理即可。查看其官方文档。
评论
lxml
cssselect
parsed_html = BeautifulSoup(html)
对我不起作用,确实parsed_html = BeautifulSoup(html, 'html.parser')
我猜你要找的是pyquery:
pyquery:一个类似 JQure 的 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的inspect元素相同的选择器。例如:
检查的元素选择器是“div#mw-head.noprint”。所以在pyquery中,你只需要传递这个选择器:
pq('div#mw-head.noprint')
我推荐 lxml 来解析 HTML。请参阅“解析 HTML”(在 lxml 站点上)。
根据我的经验,Beautiful Soup 搞砸了一些复杂的 HTML。我相信这是因为 Beautiful Soup 不是一个解析器,而是一个非常好的字符串分析器。
评论
与其他解析器库相比,速度非常快:lxml
- http://blog.dispatched.ch/2010/08/16/beautifulsoup-vs-lxml-performance/
- http://www.ianbicking.org/blog/2008/03/python-html-parser-performance.html
而且它也很容易用于抓取 HTML 页面:cssselect
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'))
评论
import requests
doc = parse('localfile.html').getroot()
1.7
*100
我会使用 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
评论
我推荐使用 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
蟒蛇3:
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)
评论