1

http://www.co.jefferson.co.us/ats/displaygeneral.do?sch=000104をスクレイプ して、「所有者名」を取得しようとしています。私が持っているものは機能しますが、本当に醜く、最高ではありません。確かに、もっと良い方法を探しています。これが私が持っているものです:

soup = BeautifulSoup(url_opener.open(url))            
x = soup('table', text = re.compile("Owner Name"))
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next

関連するHTMLは

<td valign="top">
    <table border="1" cellpadding="1" cellspacing="0" align="right">
    <tbody><tr class="tableheaders">
    <td>Owner Name(s)</td>
    </tr>

    <tr>

    <td>PILCHER DONALD L                         </td>
    </tr>

    </tbody></table>
</td>

うわー、美しいスープについてたくさんの質問があります、私はそれらを調べましたが、私を助ける答えを見つけられませんでした、うまくいけばこれは重複した質問ではありません

4

3 に答える 3

5

編集:OPが投稿したHTMLは明らかに嘘をついています-tbody彼がそのHTMLに含めることを強調したとしても、実際には検索するタグはありません。したがって、table代わりに使用するように変更しますtbody)。

必要なテーブル行がいくつかある可能性があるため(たとえば、指定したものの兄弟URLを参照し、最後の数字4を5に変更)、次のようなループをお勧めします。

# locate the table containing a cell with the given text
owner = re.compile('Owner Name')
cell = soup.find(text=owner).parent
while cell.name != 'table': cell = cell.parent
# print all non-empty strings in the table (except for the given text)
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)):
  print x

これは、ページ構造の小さな変更に対してかなり堅牢です。対象のセルを特定すると、テーブルタグが見つかるまで親をループし、次に、空ではない(または空白だけの)テーブル内のすべてのナビゲート可能な文字列をループします。ownerヘッダー。

于 2009-11-30T00:36:16.080 に答える
3

これは、BeautifulsoupディスカッショングループからのAaronDeVoreの回答です。

soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")

実際の名前の文字列を取得するにはTag.stringが必要です

name = label.findNext('td').string

あなたがそれらの束をしているなら、あなたはリスト内包に行くことさえできます。

names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]
于 2009-11-30T20:23:16.310 に答える
1

これはわずかな改善ですが、3人の親を取り除く方法がわかりませんでした。

x[0].parent.parent.parent.findAll('td')[1].string
于 2009-11-30T00:08:25.480 に答える