使用PythonparsingHTML
我正在寻找一个Python的HTMLparsing器模块,它可以帮助我以Python列表/字典/对象的forms获取标签。
如果我有一个文件的forms:
<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来访问嵌套标签,这样我就可以基本上要求它把body
标签中class='container'
的div
标签中的内容/文本或类似的东西。
如果你已经使用Firefox的“检查元素”function(查看HTML),你会知道它会给你所有的标签,像树一样,以一种很好的嵌套方式。
我更喜欢一个内置的模块,但可能会有点太多。
在Stack Overflow和一些博客上,我经历了大量的问题,其中大部分都提到了BeautifulSoup或者lxml或者HTMLParser,但是很less有这些详细的function,只是最终争论哪个更快更好。
所以我基本上可以要求它把body标签中包含的class ='container'的div标签中的内容/文本,或类似的东西。
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是如何工作的。 看看它的官方文档 。
我想你在找什么是pyquery :
pyquery:一个类似jquery的python库。
你想要的例子可能是这样的:
from pyquery import PyQuery html = # Your HTML CODE pq = PyQuery(html) tag = pq('div#class') print tag.text()
它使用与Firefox或Chrome的检查元素相同的select器。 例如:
被检查的元素select器是'div#mw-head.noprint'。 所以在pyquery中,你只需要通过这个select器:
pq('div#mw-head.noprint')
在这里,您可以阅读更多关于Python中不同的HTMLparsing器及其性能的信息。 即使这篇文章有点过时,它仍然给你一个很好的概述。
Python的HTMLparsing器的性能
我build议BeautifulSoup,即使它不是内置的。只是因为它很容易与这些types的任务。 例如:
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
与其他parsing器库相比, lxml
非常快速:
- http://blog.dispatched.ch/2010/08/16/beautifulsoup-vs-lxml-performance/
- http://www.ianbicking.org/blog/2008/03/python-html-parser-performance.html
而使用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文档
我build议lxmlparsingHTML。 请参阅“parsingHTML”(位于lxml站点上)。
根据我的经验,美味的汤在一些复杂的HTML上起了作用。 我相信这是因为美丽的汤不是一个parsing器,而是一个非常好的string分析器。
我会使用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
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)