Pyparsing issue-scraping网站,不使用HTML标签

时间:2012-02-23 15:26:16

标签: pyparsing

我正在尝试使用pyparsing来解析来自网站的信息,但是,我发现的所有示例主要使用HTML标记来识别不同的文本位。

例如,使用HTML标记很难分开以下内容(该程序不适用于此站点)。我怎么能分开作者,标题等?

import urllib

from pyparsing import *

paraStart,paraEnd = makeHTMLTags("p")

# read HTML from a web page
serverListPage = urllib.urlopen( "http://www.cs.cf.ac.uk/contactsandpeople/allpubs.php?emailname=C.L.Mumford" )
htmlText = serverListPage.read()
serverListPage.close()

para = paraStart + SkipTo(paraEnd).setResultsName("body") + paraEnd


for tokens,start,end in para.scanString(htmlText):
    print tokens.body,'->',tokens.href

我对pyparsing相对较新,并浏览过书籍和网络的例子。任何帮助将非常感激。感谢。

编辑:当我运行程序时,我得到以下内容:     跳到内容     跳至导航菜单

但是,如果我更改为从(“p”)到(“li”)搜索其他站点,则会在块中提取信息。

1 个答案:

答案 0 :(得分:3)

您必须了解有关正在抓取数据的网页内容的更多信息。如果你只是盲目地在页面上抛出tag-tagend解析器,你将获得随机的文本块。

尝试打印整页HTML(您的脚本在变量htmlText中捕获),然后开始在文本中查找指向您感兴趣的数据的模式。数据本身可能是其中的一部分这种模式,没关系。 <>内的文本位是HTML标记 - pyparsing包含makeHTMLTags方法的原因是标记内的文本结构可以随着狂野而变化,可选和意外顺序的意外属性或属性,或意外的大写/小写或意外空格 - makeHTMLTags涵盖了所有这些内容,这就是大多数使用pyparsing编写的Web scraper使用该方法来帮助定义模式的原因得到有趣的数据。

尝试此过程:在纸上打印htmlText。使用蓝色突出显示器突出显示所需的数据。然后使用黄色荧光笔识别有助于定位该数据的周围数据或标签。现在,您有一个模板,介绍如何构建您的pyparsing表达式以提取该数据。你已经开始使用结果名称(解析器中的'body'定义) - 这是一个好习惯,继续保持它。使用结果名称标记蓝色文本的所有表达式,以便在匹配整个模式后,您可以使用名称获取各个位。

祝你好运!