-1

リンクhttp://dl.acm.org/results.cfm?CFID=376026650&CFTOKEN=88529867の html ファイルから情報を引き出そうとしています。すべての論文のタイトルについて、著者、ジャーナル名、およびアブストラクトが必要です。しかし、私はそれらをまとめる前に、それぞれの最初の反復バージョンを取得しています。助けてください。つまり、最初にタイトルのリストを取得し、次に著者、次に雑誌、次に要約を取得し、次にタイトルごとに、最初にタイトル、次にそれぞれの著者、雑誌名、および要約を取得します。個別ではなく、まとめて必要です。

from BeautifulSoup import BeautifulSoup
from bs4 import BeautifulSoup
import urllib2
import requests
import re

f = open('acmpage.html', 'r') #open html file stores locally
html = f.read() #read from the html file and store the content in 'html'
soup = BeautifulSoup(html)
pret = soup.prettify()
soup1 = BeautifulSoup(pret)
for content in soup1.find_all("table"):
    soup2 = BeautifulSoup(str(content))
    pret2 = soup2.prettify()
    soup3 = BeautifulSoup(pret2)

    for titles in soup3.find_all('a', target = '_self'): #to print title
        print "Title: ", 
        print titles.get_text()
    for auth in soup3.find_all('div', class_ = 'authors'): #to print authors
        print "Authors: ", 
        print auth.get_text()
    for journ in soup3.find_all('div', class_ = 'addinfo'): #to print name of journal
        print "Journal: ", 
        print journ.get_text()
    for abs in soup3.find_all('div', class_ = 'abstract2'): # to print abstract
        print "Abstract: ", 
        print abs.get_text()
4

2 に答える 2

1

情報の各リストを別々に検索している場合、各タイプの情報が別々にリストされている理由についてはほとんど疑問の余地がありません。

あなたのコードも冗長性に満ちています。BeautifulSoup の1 つのバージョンをインポートするだけで済み (最初のインポートは 2 番目のインポートによってシャドウされます)、要素を 2 回再解析する必要もありません。2 つの異なるURL 読み込みライブラリをインポートし、代わりにローカル ファイルを読み込むことで両方を無視します。

代わりに、タイトル情報を含むテーブル行を検索し、テーブル行ごとに、含まれている情報を解析します。

このページでは、複数の表を含むより複雑な (そして率直に言って、まとまりのない) レイアウトになっているため、見つかったタイトル リンクごとに表の行に移動するのが最も簡単です。

from bs4 import BeautifulSoup
import requests

resp = requests.get('http://dl.acm.org/results.cfm', 
                    params={'CFID': '376026650', 'CFTOKEN': '88529867'})
soup = BeautifulSoup(resp.content, from_encoding=resp.encoding)

for title_link in soup.find_all('a', target='_self'):
    # find parent row to base rest of search of
    row = next(p for p in title_link.parents if p.name == 'tr')
    title = title_link.get_text()
    authors = row.find('div', class_='authors').get_text()
    journal = row.find('div', class_='addinfo').get_text()
    abstract = row.find('div', class_='abstract2').get_text()

呼び出しは、要素が見つかるnext()まで、タイトル リンクの各親を通過するジェネレータ式をループします。<tr>

これで、すべての情報がタイトルごとにグループ化されました。

于 2013-11-05T10:50:42.867 に答える
0

最初の addinfo div を見つける必要があります。次に、ドキュメント内のさらに先の div で発行者を見つけるために忍び寄る必要があります。ツリーを囲んでいる tr まで上ってから、連続する tr の次の兄弟を取得する必要があります。次に、その tr 内で次のデータ項目 (パブリッシャー) を検索します。

表示する必要があるすべてのアイテムに対してこれを実行したら、見つかったすべてのアイテムに対して単一の印刷コマンドを発行します。

于 2013-11-05T08:56:33.557 に答える