1

ウェブサイトをスクレイピングしようとしています。ウェブサイトのコンテンツを文字列/ファイルに取得できました。

ここで、次のような特定の行を検索したいと思います。

<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>

キー 1 は Web サイト内に 1 つだけであることが保証されており、値 1 を取得する必要があります。これを行う最善の方法は何ですか。正規表現を使用している場合は、どのように見えるべきか教えていただけますか。私は正規表現をあまり使用していません。

よろしく、AMM

4

4 に答える 4

5

正規表現を使用するのではなく、BeautifulSoupに html を解析させることから始めます。

次に、組み込みの検索機能を使用して、「abc」および「aom_pb」クラスを検索できます。

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(downloaded_str)
key = soup.find('span', {'class': 'abc'}).text
value = soup.find('span', {'class': 'aom_pb'}).text 

クラス タグが一意でない場合は、適切なタグが見つかるまでループします。

for li in soup.findAll('li'):
    if li.find('span', attrs={'class': 'abc'}, text='Key 1:'):
        print li.find('span', {'class': 'aom_pb'}).text

重要な点は、パーサーがこれを不明確なテキスト検索の問題ではなく、ツリー ナビゲーションの問題に変換できるようにすることです。

BeautifulSoup は、セットアップに簡単に追加できる単一の純粋な python ファイルです。人気のある選択肢です。より洗練された代替手段には、html5libおよびlxmlが含まれます。標準ライブラリにはHTMLParserが含まれていますが、やや単純化されており、不適切な形式の HTML をうまく処理できません。

正規表現のアプローチは少し壊れやすいですが、次のようなことを試すことができます (データが通常どのように配置されているかによって異なります)。

>>> s = '''<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>'''
>>> re.search(r'Key 1:.*?(Value .*?)<', s).group(1)
'Value 1'
于 2011-11-06T01:03:54.833 に答える
4

lxmlHTML からデータを抽出するには、パーサーなどを使用する必要があります。このようなタスクに正規表現を使用することは、悪い考えです

Lxml では、XPath 式を使用して要素を選択できます。この場合、式を使用して関連する「キー」スパンを選択できます//span[@class='abc' and text()='Key 1:']。この式は、ツリー全体を検索してspan、クラスが でabcあり、正確な text を含む要素を探しますKey 1:

次に、要素で使用.getnext()して、必要なデータを含む次の要素を取得できます。

これを完全に行う方法は次のとおりです。

import lxml.html as lh

html = """
<html>
<head>
    <title>Test</title>
</head>
<body>
<ul>
    <li><span class="abc">Key 3:</span>&nbsp;<span class="aom_pb">Mango</span></li>
    <li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Pineapple</span></li>
    <li><span class="abc">Key 2:</span>&nbsp;<span class="aom_pb">Apple</span></li>
    <li><span class="abc">Key 7:</span>&nbsp;<span class="aom_pb">Peach</span></li>
</ul>
</body>
</html>
"""

tree = lh.fromstring(html)

for key_span in tree.xpath("//span[@class='abc' and text()='Key 1:']"):
    print key_span.getnext().text

結果:

Pineapple

于 2011-11-06T01:14:56.830 に答える
2

HTML の解析に正規表現を使用しないでください。適切な名前の python 用の HTML パーサー モジュールがありますHTMLParserhttp://docs.python.org/library/htmlparser.html

于 2011-11-06T01:03:52.210 に答える
1

BeautifulSoupを使用する別のアプローチ:<li>要素をループし、それらの内部の<span>を確認します。

import BeautifulSoup

downloaded_str='''
<li><span class="abc">Key 0:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
<li><span class="abc">Key 2:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
'''

soup = BeautifulSoup.BeautifulSoup(downloaded_str)
for li in soup.findAll('li'):
    span = li.find('span', {'class': 'abc'}, recursive=False)
    if span and span.text == 'Key 1:':
        return li.find('span', {'class': 'aom_pb'}, recursive=False).text
于 2011-11-06T01:20:24.430 に答える