3

URL に基づいて 20 の異なる HTML ページを解析する必要があるプロジェクトに取り組んでおり、それらすべてから情報を取得したいと考えています。ページの構造は異なり、必要な情報は各サイトの異なる場所にあります。

Python lxml モジュールを試してみることができると思いました。情報は各サイトのさまざまな場所で見つけることができるため、20 * X の異なる reg をまとめるのが非常に面倒です。これらの要素には絶対 XPath を使用することをお勧めします。このようにして、Chrome ブラウザーの Copy XPath 機能を利用するだけで、各 HTML 要素の明確なパスをパーサーに渡すことができ、多くのコードを記述する必要はありません。

Python で絶対 XPath を使用して HTML 要素を参照する方法を示す例が見つかりませんでした。一部のコメントは、絶対パスの代わりに相対パスを使用する方が良いと言っていますが、その理由は実際には説明していません。ただし、相対 XPath を使用して要素を参照することは、コーディング作業が再び必要になることを意味します。

さらに複雑なことに、これら 20 のサイトは Unicode です。

Python で絶対 XPath を使用して HTML 要素を参照し、このようなテキスト値を取得する方法はありますか?

/html/body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td/table/tbody/tr/td[2]/font/b

...そして、HTML 要素のテキスト値を返します。

これまでのところ、相対XPathでうまく機能する次のコードを取得しましたが、絶対を使用すると以下のエラーが発生します。

import urllib2
from lxml import html
from bs4 import UnicodeDammit


response = urllib2.urlopen('http://oneofthesites.com')
content = response.read()
doc = UnicodeDammit(content, is_html=True)
parser = html.HTMLParser(encoding=doc.original_encoding)
root = html.document_fromstring(content, parser=parser)
data = root.find('/html/body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[1]/td[2]/b').text_content()
print(data)

エラーは次のとおりです。

SyntaxError: cannot use absolute path on element

たぶん私の基本的なコンセプトが間違っているので、これらのページをどのように処理できるかについての他のアイデアは大歓迎です!

g0m3z、事前にご協力いただきありがとうございます

4

1 に答える 1

5

あなたが使用しているhtml.document_fromstring(); Elementこれはオブジェクトではなく を返しElementTreeます。絶対パスは、後者のタイプでのみサポートされています。

次の 2 つのオプションがあります。

  • 使用html.parse(response)(注、の結果ではありませんresponse.read()); これは適切なツリー オブジェクトを返します。

  • 相対 XPath 式を使用します。単純に ; に置き換え/htmlます.。トップレベルの要素はすべての<html>タグの後にあり、残りはその要素に関連しています:

    data = root.find('./body/div[1]/table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]/div/table/tbody/tr[1]/td[2]/b').text_content()
    
于 2013-05-03T21:17:55.423 に答える