5

URL から取得した特定のページの構文は次のとおりです。

<p>
    <strong>Name:</strong> Pasan <br/>
    <strong>Surname: </strong> Wijesingher <br/>                    
    <strong>Former/AKA Name:</strong> No Former/AKA Name <br/>                    
    <strong>Gender:</strong> Male <br/>
    <strong>Language Fluency:</strong> ENGLISH <br/>                    
</p>

名前、姓などのデータを抽出したい (このタスクを多くのページで繰り返す必要があります)

そのために、次のコードを使用してみました。

import urllib2

url = 'http://www.my.lk/details.aspx?view=1&id=%2031'
source = urllib2.urlopen(url)

start = '<p><strong>Given Name:</strong>'
end = '<strong>Surname'
givenName=(source.read().split(start))[1].split(end)[0]

start = 'Surname: </strong>'
end = 'Former/AKA Name'
surname=(source.read().split(start))[1].split(end)[0]

print(givenName)
print(surname)

source.read.split メソッドを 1 回だけ呼び出すと、正常に動作します。しかし、それを 2 回使用すると、リスト インデックスが範囲外というエラーが発生します。

誰かが解決策を提案できますか?

4

4 に答える 4

7

BeautifulSoupを使用してHTML文字列を解析できます。

これがあなたが試みるかもしれないいくつかのコードです、
それは(htmlコードによって作られたテキストを取得するために)BeautifulSoupを使用していて、そしてデータを抽出するために文字列を解析します。

from bs4 import BeautifulSoup as bs

dic = {}
data = \
"""
    <p>
        <strong>Name:</strong> Pasan <br/>
        <strong>Surname: </strong> Wijesingher <br/>                    
        <strong>Former/AKA Name:</strong> No Former/AKA Name <br/>                    
        <strong>Gender:</strong> Male <br/>
        <strong>Language Fluency:</strong> ENGLISH <br/>                    
    </p>
"""

soup = bs(data)
# Get the text on the html through BeautifulSoup
text = soup.get_text()

# parsing the text
lines = text.splitlines()
for line in lines:
    # check if line has ':', if it doesn't, move to the next line
    if line.find(':') == -1: 
        continue    
    # split the string at ':'
    parts = line.split(':')

    # You can add more tests here like
    # if len(parts) != 2:
    #     continue

    # stripping whitespace
    for i in range(len(parts)):
        parts[i] = parts[i].strip()    
    # adding the vaules to a dictionary
    dic[parts[0]] = parts[1]
    # printing the data after processing
    print '%16s %20s' % (parts[0],parts[1])

ヒント:BeautifulSoupを使用してHTMLを解析する場合は、またはなど
の特定の属性が必要です。つまり、同じタイプのすべてのタグを同じIDまたはクラスに保つ必要があります。class=inputid=10


コメントについてはよく更新
してください。以下のコードを参照してください。
上記のヒントが適用され、作業(およびコーディング)がはるかに簡単になります。

from bs4 import BeautifulSoup as bs

c_addr = []
id_addr = []
data = \
"""
<h2>Primary Location</h2>
<div class="address" id="10">
    <p>
       No. 4<br>
       Private Drive,<br>
       Sri Lanka&nbsp;ON&nbsp;&nbsp;K7L LK <br>
"""
soup = bs(data)

for i in soup.find_all('div'):
    # get data using "class" attribute
    addr = ""
    if i.get("class")[0] == u'address': # unicode string
        text = i.get_text()
        for line in text.splitlines(): # line-wise
            line = line.strip() # remove whitespace
            addr += line # add to address string
        c_addr.append(addr)

    # get data using "id" attribute
    addr = ""
    if int(i.get("id")) == 10: # integer
        text = i.get_text()
        # same processing as above
        for line in text.splitlines():
            line = line.strip()
            addr += line
        id_addr.append(addr)

print "id_addr"
print id_addr
print "c_addr"
print c_addr
于 2013-02-23T05:24:49.003 に答える
5

read() を 2 回呼び出しています。それが問題だ。read を 1 回呼び出すのではなく、データを変数に格納し、read() を呼び出していた場所でその変数を使用します。このようなもの:

fetched_data = source.read()

じゃあ後で...

givenName=(fetched_data.split(start))[1].split(end)[0]

と...

surname=(fetched_data.split(start))[1].split(end)[0]

それはうまくいくはずです。コードが機能しなかった理由は、 read() メソッドが最初にコンテンツを読み取っているためですが、読み取りが完了した後、コンテンツの最後を見ているためです。次に read() を呼び出すと、コンテンツが残っていないため、例外がスローされます。

urllib2のドキュメントとファイル オブジェクトのメソッドを確認してください。

于 2013-02-23T05:31:16.873 に答える
1

HTQL を使用できます。

page="""
<p>
    <strong>Name:</strong> Pasan <br/>
    <strong>Surname: </strong> Wijesingher <br/>                    
    <strong>Former/AKA Name:</strong> No Former/AKA Name <br/>                    
    <strong>Gender:</strong> Male <br/>
    <strong>Language Fluency:</strong> ENGLISH <br/>                    
</p>
"""

import htql
print(htql.query(page, "<p>.<strong> {a=:tx; b=:xx} "))

# [('Name:', ' Pasan '), 
#  ('Surname: ', ' Wijesingher '), 
#  ('Former/AKA Name:', ' No Former/AKA Name '), 
#  ('Gender:', ' Male '), 
#  ('Language Fluency:', ' ENGLISH ')
# ]
于 2013-02-26T04:58:17.017 に答える