使用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器。 例如:

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

被检查的元素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非常快速:

而使用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

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 

我推荐使用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)