使用python提取网页的各个部分

时间:2012-07-14 01:31:59

标签: python

所以我有一个数据检索/输入项目,我想提取网页的某个部分并将其存储在文本文件中。我有一个url的文本文件,该程序应该为每个url提取页面的相同部分。

具体而言,该程序会在this等页面上复制“法定权限:”之后的法律法规。如您所见,列出的法规只有一个。但是,一些网址看起来也像this,这意味着有多个独立的法规。

我的代码适用于第一类页面:

from sys import argv
from urllib2 import urlopen

script, urlfile, legalfile = argv
input = open(urlfile, "r")
output = open(legalfile, "w")

def get_legal(page):
    # this is where Legal Authority: starts in the code
    start_link = page.find('Legal Authority:')
    start_legal = page.find('">', start_link+1)
    end_link = page.find('<', start_legal+1)
    legal = page[start_legal+2: end_link]
    return legal

for line in input:
  pg = urlopen(line).read()
  statute = get_legal(pg)
  output.write(get_legal(pg))

在“legalfile”输出.txt中为我提供所需的法规名称。但是,它无法复制多个法令名称。我尝试过这样的事情:

def get_legal(page):
# this is where Legal Authority: starts in the code
    end_link = ""
    legal = ""
    start_link = page.find('Legal Authority:')
    while (end_link != '</a>&nbsp;'):
        start_legal = page.find('">', start_link+1)

        end_link = page.find('<', start_legal+1)
        end2 = page.find('</a>&nbsp;', end_link+1)
        legal += page[start_legal+2: end_link] 
        if 
        break
    return legal

由于每个法规列表以'</a>&nbsp;'结尾(检查两个链接中的任何一个的来源),我认为我可以使用这个事实(将其作为索引的结尾)循环并收集所有一个字符串中的法规。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我建议使用BeautifulSoup来解析和搜索你的html。这比基本的字符串搜索要容易得多。

以下示例提取了包含<a>&gt;的<td>标记内找到的所有<b>Legal Authority:</b代码。标签。 (请注意,我在这里使用requests库来获取页面内容 - 这只是urlopen推荐且易于使用的替代方法。)

import requests
from BeautifulSoup import BeautifulSoup

# fetch the content of the page with requests library
url = "http://www.reginfo.gov/public/do/eAgendaViewRule?pubId=200210&RIN=1205-AB16"
response = requests.get(url)

# parse the html
html = BeautifulSoup(response.content)

# find all the <a> tags
a_tags = html.findAll('a', attrs={'class': 'pageSubNavTxt'})


def fetch_parent_tag(tags):
    # fetch the parent <td> tag of the first <a> tag
    # whose "previous sibling" is the <b>Legal Authority:</b> tag.
    for tag in tags:
        sibling = tag.findPreviousSibling()
        if not sibling:
            continue
        if sibling.getText() == 'Legal Authority:':
            return tag.findParent()

# now, just find all the child <a> tags of the parent.
# i.e. finding the parent of one child, find all the children
parent_tag = fetch_parent_tag(a_tags)
tags_you_want = parent_tag.findAll('a')

for tag in tags_you_want:
    print 'statute: ' + tag.getText()

如果这不是您需要做的,BeautifulSoup仍然是您可能想要用来筛选html的工具。

答案 1 :(得分:0)

他们在那里提供XML数据,请参阅my comment。如果您认为无法下载那么多文件(或者另一端可能不喜欢这么多HTTP GET请求),我建议他们的管理员询问他们是否会以不同的方式为您提供访问数据的方式。

我过去曾做过两次(有科学数据库)。在一个例子中,数据集的绝对大小禁止下载;他们运行了我的SQL查询并通过电子邮件发送结果(但以前提供过邮寄DVD或硬盘)。在另一种情况下,我本可以向web服务做几百万个HTTP请求(并且它们没问题),每个请求大约1k字节。这将花费很长时间,而且非常不方便(需要一些错误处理,因为其中一些请求总是超时)(并且由于paging而非原子)。我被邮寄了一张DVD。

我认为管理和预算办公室可能会有类似的适应性。