1

urllib2/beautifulSoup に問題があります。私はウェブから私たちの特許に関する情報を読み込もうとしています. 正確には、申請がいつ提出されたかに関する情報を取得する必要があります。この情報は次の文にあります。

この出願は、米国暫定出願の優先権を主張します。サー。2003年10月29日に出願された米国特許第60/515,559号に開示されており、その開示全体は参照により本明細書に具体的に組み込まれる。

この文は特定のタグの一部ではないので、HTML全体で正規表現を使用するのが良いかもしれないと思ったので(他の方法をいくつか試しましたが、うまくいきませんでした)、そのようなものを書きました(すでにBeautifullSoupを使用して他の情報を取得しています):

url = "http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=7442851.PN.&OS=PN/7442851&RS=PN/7442851"

request = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
patent_data = bs(urllib2.urlopen(request).read())

#1
r = re.compile("[A-Z][a-z]{2}\. \d+, \d\d\d\d")
txt = r.findall(str(patent_data))
print txt

#2
print patent_data

問題を説明する 2 つの部分があります。

  1. 正規表現を実行して一致を見つけようとしましたが、結果の変数 txt は空のリストです...
  2. HTML全体を単純に印刷しようとすると、結果が完全ではないことがわかります(で終わります(...)<center><b>Other References</b></center> <tr><td></td></tr></br></table></hr></hr></p></hr>)。

ダウンロードできるデータ量に制限はありますか? どうすればそれを克服できますか?

[clj への回答] 私は自分でプロキシを使用していませんが、インターネット プロバイダーに何かがあるかどうかはわかりません... コードと情報については、次の結果が得られます。

print "info: ", r.info(); 
print "code: ", r.getcode()

output:
info:  Server: NetAnswer Server 1.0
Content-Type: text/html

code:  200

もう1つ:問題があれば、Win7 64ビットでPython 2.7.5を使用しています...

4

5 に答える 5

1

リクエストを使用すると、完全に正常に動作します

import requests
import re

url = "http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=7442851.PN.&OS=PN/7442851&RS=PN/7442851"
response = requests.get(url)
data = response.text
r = re.compile("[A-Z][a-z]{2}\. \d+, \d\d\d\d")
txt = r.findall(str(data))

出力:

【'4月 2000 年 4 月 21 日 2000 年 7 月 21 日 2003 年 10 月 19 日 1999 年 4 月 22 日 2004 年 11 月 20 日 2003 年 11 月 21 日 2003 年 10 月 21 日 29、2003']

于 2013-09-30T19:26:41.427 に答える
0

サンプルコード(必要なインポートを含む)は実際に私にも機能します(OSX python 2.7.2):

['Apr. 21, 2000', 'Apr. 21, 2000', 'Jul. 19, 2003', 'Oct. 22, 1999', 'Apr. 20, 2004', 'Nov. 21, 2003', 'Nov. 21, 2003', 'Oct. 29, 2003']

シバン行の下にユニコードを設定していますが、それがあってもなくても機能します。

ステートメントのbs()周りを削除するとどうなりますか? urllib2あなたの出力はまだ切り捨てられていますか?

patent_data = urllib2.urlopen(request).read()

Beautiful Soup オブジェクトではなく、このテキスト結果を使用しても同じ検索結果が得られます。

生データでは、Other References私が見つけた唯一の言及は、切り捨てられた文字列の終わりであるとあなたが言うことと一致しません...

  <br /> <center><b>Other References</b></center> <tr><td><align><br />Liu C. et al.

その後、文字列に多くの一重引用符と二重引用符があり、解析の問題が発生する可能性がありますか?

于 2013-09-26T20:38:18.977 に答える
0

urlopen(...).read()bs4 で問題を再現できますが、応答を直接解析しても問題は見られません。ドキュメントは不完全に見えるかもしれませんが、実際には終了</HTML>タグの後にいくつかのタグが続きます。

Firefox でページ ソースを見ると、同じ形式の不正な HTML ドキュメントが表示されます。これは、bs4 が処理できないドキュメントにすぎないと思います。

>>> txt = urllib2.urlopen(request).read()
>>> print txt[txt.index("/HTML"):]
/HTML>
<P><A  HREF=/></A>
<A  HREF=/netahtml/PTO/srchnum.htm></A>
<A  HREF=/netacgi/nph-Parser?SectSect2=HITOFF&d=PALL&p=netahtml%2FPTO%2Fsrchnum.htm&r==54285IMG ALIGN=MIDDLE SRC=/netaicon/PTO/hitlist.gif border=HIT_LIST]></A>

最後に、bs3 を試してみました。ドキュメントを正しく解析しているように見えます。少なくとも、直接r.findall(str(BeautifulSoup(txt)))解析した場合と同じリストが返されます。txt

于 2013-09-27T19:48:36.387 に答える
0

他の人たちと同じように、戻ってくるものを BS4 に解析させることができません。私はBS3をインストールする立場にないので、ここで行き止まりになっています.

しかし、urllib2 は問題なくドキュメントを取得しているようです。

あなたの問題の少なくとも一部 (質問の内容に基づく) は、ダウンロードしたデータを取得して BS に直接実行していることです。

それ以外の

patent_data = bs(urllib2.urlopen(request).read())

のようなものを試してください

patent_html = urllib2.urlopen(request).read()
patent_data = bs(patent_html)

Patent_html は実際には、返される HTML の単なる文字列です。BS が出力を読みやすくするためにstrメソッドで何かを行っているため、patent_data はおかしいように見えます。

その場合、文字列に変換して正規表現でスキャンしようとすると失敗するのはそのためです。切り詰められた文字列をスキャンしているため、探しているものが見つかりません。それだけです。

BS を写真から完全に取り除き、元の生の文字列 (私の例ではpatent_html) を正規表現でスキャンするだけの価値があるかもしれません。テキストが規則的ではないため、正規表現を使用して HTML を実際に処理できないという通常の警告がすべてあります。

于 2013-10-02T16:05:01.590 に答える