beautifulSoup屏幕抓取列表不正确嵌套<ul> s </ul>

时间:2011-12-03 12:03:05

标签: python screen-scraping beautifulsoup web-scraping

我(非常)是BeautifulSoup的新手,过去三天试图从http://www.ucanews.com/diocesan-directory/html/ordinary-of-philippine-cagayandeoro-parishes.html获取一系列教堂。

似乎数据没有正确嵌套,但只是为了演示目的而标记。据推测,层次结构是

Parishes
    District
    (data)
        Vicariate
        (data)
            Church
            (data)

然而,我所看到的是每个教堂都以子弹开头,每个入口由两个换行符隔开。我所追求的字段名称用斜体表示,并用“:”与实际数据分开。每个单位条目(区| Vicariate | Parish)可能有一个或多个数据字段。

到目前为止,我可以取消一些数据,但我无法显示实体的名称。

soup=BeautifulSoup(page)
for e in soup.table.tr.findAll('i'):
    print e.string, e.nextSibling

最后,我希望逐列转换数据:district, vicariate, parish, address, phone, titular, parish priest, <field8>, <field9>, <field99>

希望在正确的方向上有一个好的推动。

1 个答案:

答案 0 :(得分:2)

不幸的是,这会有点复杂,因为这种格式有一些您需要清晰标记所需的数据。

数据模型

另外,您对嵌套的理解并不完全正确。实际的天主教会结构(不是这个文件结构)更像是:

District (also called deanery or vicariate. In this case they all seem to be Vicariates Forane.)
    Cathedral, Parish, Oratory

请注意,没有要求,Parish属于区/ deanery,尽管他们通常会这样做。我认为该文件说区域后面列出的所有内容都属于该区域,但您无法确切知道。

那里还有一个不是教会而是社区的入口(San Lorenzo Filipino-Chinese Community)。这些在教会中没有明显的身份或治理(即它不是建筑物) - 相反,它是一个非地域的人群,牧师被指派照顾。

解析

我认为你应该采取增量方法:

  1. 找到所有li元素,每个元素都是“item”
  2. 项目的名称是第一个文本节点
  3. 找到所有i元素:这些是键,属性值,列行等
  4. 直到下一个i(由br分隔)的所有文字都是该密钥的值。
  5. 此页面的一个特殊问题是,其html 病态错​​误,您需要使用MinimalSoup正确解析它。特别是{ {1}}认为BeautifulSoup元素是嵌套的,因为文档中的任何位置都没有liol

    此代码将为您提供元组列表的列表。每个元组都是项目的ul对。

    拥有此数据结构后,您可以按照自己喜欢的方式进行规范化,转换,嵌套等,并将HTML保留在后面。

    ('key','value')