1

我只是在寻找有关 python 网络抓取的一些信息。我正在尝试从此时间表中获取所有数据,并且我希望将课程链接到其开启时间。查看 html 有多个表(表中的表)。我打算将 Google App Engine 与 Python 一起使用(也可能是 BeautifulSoup)。关于解决此问题的最佳方法的任何建议是?

谢谢

更新:

我已经设法使用以下代码从表中提取所需的数据:

import urllib
from lxml import etree
import StringIO

url = "http://ttcache.dcu.ie/Reporting/Individual;Locations;id;lg25? 
template=location+Individual&weeks=20&days=1-5&periods=1-30&Width=0&Height=0"
result = urllib.urlopen(url)
html = result.read()

parser = etree.HTMLParser()
tree   = etree.parse(StringIO.StringIO(html), parser)

xpath = "//table[2]/tr/td//text()"

filtered_html = tree.xpath(xpath)

print filtered_html

但是我得到很多这些u'\xa0', u'\xa0', '\r\n', '\r\n'字符分散在整个解析的文本中。关于如何对抗这些有什么建议吗?

谢谢

4

1 回答 1

1

可用于解析 HTML 的最佳库是 lxml,它基于 libxml2。虽然它是为 XML 解析而设计的,但它也有一个 HTML 解析器,它对标签汤的处理比 BeautifulSoup 好得多。由于解析器在 C 中,它也快得多。

您还可以访问 XPath 以查询 HTML dom,libxml2 支持 XPaths 中的正则表达式匹配,这对于网络抓取非常有用。

libxml2 和 lxml 得到很好的支持,您会发现所有主要发行版上都有它们的软件包。如果您使用的是 2.7,Google App 引擎似乎也支持它https://developers.google.com/appengine/docs/python/tools/libraries27

编辑:

你得到的字符是由于页面上有很多空的表格单元格,所以你的 xpath 经常匹配空白字符(它们是不间断的空格)。您可以使用正则表达式跳过那些没有非空格字符的文本节点,如下所示:

xpath = "//table[2]/tr/td//text()[re:match(., '\\S')]"

filtered_html = tree.xpath(
    xpath,
    namespaces={"re": "http://exslt.org/regular-expressions"})

命名空间位只是告诉 lxml 你想使用它的正则表达式扩展。

于 2013-03-15T12:47:35.430 回答