Python 解析HTML表的最快、最简单、最好的方法?

Python 解析HTML表的最快、最简单、最好的方法?,python,regex,html-parsing,beautifulsoup,Python,Regex,Html Parsing,Beautifulsoup,我正试图把这个表转换成数组格式,这样我就可以用它做任何我想做的事情。最好使用PHP、python或JavaScript 这是一种经常出现的问题,所以我不是在这个具体问题上寻求帮助,而是在寻找如何解决所有类似问题的想法 首先想到的是美丽的群像。 另一种可能是在TextMate中复制/粘贴它,然后运行正则表达式 你有什么建议 这是我最后写的脚本,但正如我所说,我正在寻找一个更通用的解决方案 from BeautifulSoup import BeautifulSoup import urllib2

我正试图把这个表转换成数组格式,这样我就可以用它做任何我想做的事情。最好使用PHP、python或JavaScript

这是一种经常出现的问题,所以我不是在这个具体问题上寻求帮助,而是在寻找如何解决所有类似问题的想法

首先想到的是美丽的群像。 另一种可能是在TextMate中复制/粘贴它,然后运行正则表达式

你有什么建议

这是我最后写的脚本,但正如我所说,我正在寻找一个更通用的解决方案

from BeautifulSoup import BeautifulSoup
import urllib2


url = 'http://www.datamystic.com/timezone/time_zones.html';
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
tables = soup.findAll("table")
table = tables[1]
rows = table.findAll("tr")
for row in rows:
    tds = row.findAll('td')
    if(len(tds)==4):
        countrycode = tds[1].string
        timezone = tds[2].string
        if(type(countrycode) is not type(None) and type(timezone) is not type(None)):
            print "\'%s\' => \'%s\'," % (countrycode.strip(), timezone.strip())

对我的python代码的改进意见和建议也欢迎;)

避免使用正则表达式来解析HTML,它们根本不适合解析HTML,您肯定需要像BeautifulSoup这样的DOM解析器

其他一些选择

  • PHP
  • &Ruby
  • Perl/CPAN

所有这些都可以合理地容忍格式不良的HTML。

我建议使用与PHP捆绑在一起的XML解析器(如DOMDocument::loadHTMLFile)加载文档,然后使用XPath对所需数据进行grep

这不是最快的方法,但最终是最可读的(在我看来)。您可以使用Regex,它可能会快一点,但风格不好(难以调试,难以阅读)

编辑:实际上这很难,因为您提到的页面不是有效的HTML(请参阅validator.w3.org)。尤其是没有开始/结束标记的标记会严重阻碍


看起来xmlstarlet((伟大的工具))能够修复问题(运行xmlstarlet fo-R)。xmlstarlet还可以编写xpath和xslt脚本,这可以帮助您使用简单的shell脚本提取数据。

正则表达式的效率优于DOM解析器

看看这个比较:


您可以在web上找到更多搜索内容。

对于您的一般问题,请从软件包中进行尝试(将其视为stdlibs xml.etree on steroids:相同的xml api,但支持html、xpath、xslt等)

您的具体案例的一个快速示例:

from lxml import html

tree = html.parse('http://www.datamystic.com/timezone/time_zones.html')
table = tree.findall('//table')[1]
data = [
           [td.text_content().strip() for td in row.findall('td')] 
           for row in table.findall('tr')
       ]
这将为您提供一个嵌套列表:每个子列表对应于表中的一行,并包含来自单元格的数据。偷偷插入的广告行还没有被过滤掉,但它应该会让你上路。(顺便说一下:lxml很快!)

但是:更具体地说,对于您的特定用例:有更好的方式获取信息,而不是删除特定网页(旁白:请注意,网页实际上提到您不允许复制其内容)。甚至已有的库已经使用了这些信息,例如,请参见。

在构建时,我们测试了许多平台/解析器

下面是Python的基准测试结果

有关更多信息,请参阅关于媒体的完整文章:

BeautifulSoup(或另一个解析器)。除了表中那些恼人的广告外,大部分都是微不足道的。由于“HTML解析”和“正则表达式”标签的存在,强制链接:XML解析器的问题是HTML不是XML的子集,除非它对每一个XML规则(或者XML解析器被破坏)都很好地格式化,否则它将不能正常工作。例如:HTML中的

甚至不需要任何类型的结束标记。另外,像
这样简单的东西不是有效的XML。如果解析器(DOMDocument?)真的是一个HTML解析器,那么应该这样调用它,不要与XML解析器混淆:-)@pst:True,这就是为什么它有两个不同的方法“loadFile()”和“loadHTMLFile()”。php的DOM解析器能够处理正常的异常情况。但是在这种情况下,正如现在提到的,它不会这样做,因为所提到的页面甚至不是有效的html)我没有在这个特定的页面上尝试过,但是BeautifulSoup是专门为处理无效的html而编写的,只是因为你不可避免地会经常遇到它。然后“我建议用html解析器加载文档…”仅供参考,您提供的链接现在已失效。