2016-07-04 38 views
1

たとえば、this pageの特許データを解析しようとしています。最終出力は、1行につき1行、各行に(譲受人、家族ID、出願日)CSVファイルでなければなりません。 私はBeautifulSoupを使用しています。私は大部分の情報を取得し、CSVファイルを作成しています。テーブルから特定のセルの内容を取得する

私の問題は、テーブルの構造が時間の経過と共に変化することに気付いたことです。すべてのフィールドが常にそこにあるわけではありません。例えば。与えられた例では、ファミリーIDはありません。 したがって、各セルに特定の変数(hereなど)を割り当てることはできません。レポートされるフィールドの数に応じて、行数/列数も変更されます。

次のような柔軟性があるようにコードを記述したいと思います。 ヘッダー== "担当者"の場合、そのセルからテキストを取得します。それ以外の場合は空白のままにします。 header == "Family ID"の場合、そのセルからテキストを取得します。それ以外の場合は空白のままにします。

最終出力はと類似になるように:

Assignee, Family ID, filing date 
"Potomac Aviation",   , "June 11, 2002" 
"Anonymous Co", 40432687, "June 5, 2016" 
etc. 

このコードでは、最も近い私を得たものですが、私はこれまで私が終わるする場所からまだです。

fourth_table=table.find_next("table") 
header_1 = fourth_table.find('th') 
if header_1.get_text() == "Inventors:": 
    inventors=fourth_table.find('td').get_text() 

header1=fourth_table.th 
header_2 = header1.find_next('th') 
cell1=fourth_table.td 
cell2=cell1.find_next('td') 
if header_2.get_text() == "Applicant:": 
    applicant= cell2.find('td').get_text() 

これは明らかに非常に曖昧です。すべてのビットがどのように動作するかを理解したら、コードをより効率的にしようとします。

編集:これは私がもっと近づくと思う選択肢です。しかし、それは "譲受人"のためにすべて正常に動作しますが、pythonはprint(family_id)行に "None"を返します。私はスペルをチェックした。

fourth_table=table.find_next("table") 
assignee=fourth_table.find(text="Assignee:").findNext('td').get_text().replace("\n","").strip() 
#family_id=fourth_table.find(text="Family ID:").findNext('td').get_text().replace("\n","").strip() 
family_id=fourth_table.find(text="Family ID:") 
print(family_id) 

私には明らかなものがありません。 TIA!

+0

あなたは[scrapy framework](http://doc.scrapy.org/en/1.1/intro/overview.html)をそのような種類の仕事。次に、 'xpath'機能を使ってdom要素を選択する方がはるかに簡単です。 – sehrob

答えて

0

もう少し複雑ですが、実際には正規表現を使用して必要な行を見つけてテキストに改行があるので、text="Family ID":などを指定するだけで済みません。サイトおよび利用可能な場合、行はNTOがある場合、CSVが欠落しているデータのために空のエントリがあります、興味の3行を書く:

我々が得る最初の数のURLで実行
import csv 
import re 


def get_nxt_link(soup): 
    nxt = soup.select_one("img[src=/netaicon/PTO/nextdoc.gif]") 
    if nxt: 
     return urljoin(base, nxt.parent["href"]) 
    return False 

start = 'http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&Sect2=HITOFF&p=1&u=%2Fnetahtml%2FPTO%2Fsearch-bool.html&r=1&f=G&l=50&co1=AND&d=PTXT&s1=boston&s2=2005$.PD.&OS=boston%20AND%20ISD/2005&RS=boston%20AND%20ISD/2005' 

base = "http://patft.uspto.gov/" 
def get_text(soup, txt): 
    for t in txt: 
     _tag = soup.find("th", text=t) 
     yield _tag.parent.td.text.replace("\n", "") if _tag else "" 


with open("out.csv", "w") as o: 
    wr = csv.writer(o) 
    soup = BeautifulSoup(requests.get(start).content, "lxml") 
    table = soup.find("th", text="Assignee:").find_previous("table") 
    nxt = get_nxt_link(soup) 
    wr.writerow(["Assignee", "Family ID", "filing date"]) 
    text = [re.compile("Assignee:"), re.compile("Family ID:"), re.compile("Filed:")] 
    wr.writerow(tuple(get_text(table, text))) 
    while nxt: 
     soup = BeautifulSoup(requests.get(nxt).content, "lxml") 
     table = soup.find("th", text="Assignee:").find_previous("table") 
     wr.writerow(tuple(get_text(table, text))) 
     nxt = get_nxt_link(soup) 

を:

Assignee,Family ID,filing date 
"Potomac Aviation Technology Corp. (Boston, MA)",,"June 11, 2002" 
"Microsoft Corp. (Redmond, WA)",33563549,"December 31, 1998" 
"Teradyne, Inc. (Boston, MA)",32029308,"September 27, 2002" 
"First Data Corporation (Greenwood Village, CO)",22696181,"December 5, 2001" 
"Micron Technology, Inc. (Boise, ID)",35482789,"July 8, 2003" 
"Digital River, Inc. (Eden Prairie, MN)",38226542,"December 11, 2000" 
"Oracle International Corporation (Redwood Shores, CA)",35482753,"October 1, 2002" 
"The United States of America as represented by the Secretary of the Navy (Washington, DC)",35482734,"October 6, 2003" 
Garmin Ltd. (KY),21836040,"November 19, 2004" 
"Lucent Technologies Inc. (Murray Hill, NJ)",25439780,"July 30, 2001" 
"The Chamberlain Group, Inc. (Elmhurst, IL)",23942291,"October 17, 2001" 
"Inplane Photonics, Inc. (South Plainfield, NJ)",32824042,"February 7, 2003" 
"Motorola, Inc (Horsham, PA)",22314958,"November 17, 2000" 
"Xerox Corporation (Stamford, CT)",35482631,"July 7, 2004" 
"General Hospital Corporation (Boston, MA)",35480219,"October 16, 2002" 
+0

ありがとう!私は編集するのを忘れていましたが、昨夜遅くまで働きました。 findNext( 'td')。get_text()。replace( "\ n"、 "")。ストリップ()まだ、私は私のはるかに効率的なのであなたの答えを受け入れる。 –

関連する問題