0

データの取得/入力プロジェクトがあり、Web ページの特定の部分を抽出してテキスト ファイルに保存したいと考えています。URL のテキスト ファイルがあり、プログラムは各 URL のページの同じ部分を抽出することになっています。

具体的には、プログラムは、このようなページの「法的権限:」に続く法的法令をコピーします。ご覧のとおり、リストされている法令は 1 つだけです。ただし、一部の URL はこのようにも見えます。これは、複数の別個の法令があることを意味します。

私のコードは、最初の種類のページで機能します。

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;'(inspect the source of either of the two links) で終わっているので、その事実 (それをインデックスの末尾として持つ) を使用して、すべての法令を 1 つの文字列にループして収集できると考えました。何か案は?

4

2 に答える 2

2

BeautifulSoupを使用して HTML を解析および検索することをお勧めします。これは、基本的な文字列検索を行うよりもはるかに簡単です。

> タグを含むタグ<a>内で見つかったすべてのタグを取得するサンプルを次に示します。(ここではリクエストライブラリを使用してページ コンテンツを取得していることに注意してください。これは推奨される、非常に使いやすい代替手段です。) <td><b>Legal Authority:</burlopen

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()

これがまさにあなたが必要としていたものではない場合でも、HTML をふるいにかけるために使用したいツールはBeautifulSoupです。

于 2012-07-14T09:18:22.947 に答える
0

そこに XML データを提供します。私のコメントを参照してください。それほど多くのファイルをダウンロードできないと思われる場合 (または、反対側が非常に多くの HTTP GET 要求を嫌う可能性がある場合) は、データにアクセスする別の方法を親切に提供してくれるかどうか、管理者に尋ねることをお勧めします。

私は過去に2回そうしました(科学データベースを使用)。ある例では、データセットのサイズが大きすぎてダウンロードできませんでした。彼らは私の SQL クエリを実行し、結果を電子メールで送信しました (ただし、以前は DVD またはハードディスクを郵送することを申し出ていました)。別のケースでは、Web サービスに対して数百万の HTTP リクエストを実行できた可能性があり (そしてそれらは問題ありませんでした)、それぞれ約 1k バイトをフェッチしました。これには時間がかかり、非常に不便でした (これらのリクエストの一部は常にタイムアウトするため、エラー処理が必要です) (そして、ページングのために非アトミックです)。DVDが郵送されてきました。

管理予算局もおそらく同様の対応になると思います。

于 2012-07-20T21:15:34.733 に答える