2011-08-09 8 views
1

可能性の重複:
Parsing HTML in PythonどのようにしてPythonリストにHTMLリスト項目を抽出できますか?

私は、次のようなHTMLの長い文字列を持っている:

<ul> 
<li><a href="https://stackoverflow.com/a/long/link">Class1</a></li> 
<li><a href="/another/link">Class2</a></li> 
<li><img src="/image/location" border="0">Class3</a></li> 
</ul> 

それはいくつかのリスト項目(Class8へのClass1)を持っています。私は、

["Class1", "Class2", "Class3"] 

などのように、クラス名だけでPythonのリストにしたいと思います。

どうすればいいですか?私はREを使ってみましたが、動作するメソッドを見つけることができませんでした。もちろん、8つのクラスでは手作業で簡単に行うことができますが、データを抽出するためにいくつかのHTML文書があります。

ありがとうございます!すべての行末が同じであれば、あなたの例よりも、ファイルにHTMLのように、その後、何かをはるかに多様性を期待している場合:)

+1

http://docs.python.org/library/htmlparser.html –

+1

HTTPのドキュメントをチェックアウト: //stackoverflow.com/questions/3276040/how-can-i-use-the-python-htmlparser-library-to-extract-data-from-a-specific-div-t HTMLParserの例が必要な場合 –

+0

BeautifilSoupによって: 'スープ= BeautifilSoup(HTML); soup2.findAll( "li"、text = True); '、すべてのクラス名を返します。 – kenorb

答えて

0

これは動作しますが、ただ迅速かつ醜いハックとしてそれを取る必要があり、do not parse HTML with regular expressions

>>> hdata = """<ul> 
... <li><a href="https://stackoverflow.com/a/long/link">Class1</a></li> 
... <li><a href="/another/link">Class2</a></li> 
... <li><img src="/image/location" border="0">Class3</a></li> 
... </ul>""" 
>>> import re 
>>> lire = re.compile(r'<li>.*?>(.*?)<.*') 
>>> [lire.search(x).groups()[0] for x in hdata.splitlines() if lire.search(x)] 
    ['Class1', 'Class2', 'Class3'] 

あなたがそうでなければBeautiful Soup

+0

ありがとう!私は実際に美しいスープを使用してHTML文書の残りの部分とリストを分離しましたが、それよりもさらに進んでいく方法はわかりませんでした。私はそれを見てみましょう:) –

0

、あなたは

re.compile(r'^<li><.*>(.*)</a></li>$') 

のような正規表現を試みることができますおそらくパーサーが良いでしょう。

0

チェックを探して、あなたのソースが有効なXMLである場合Element Treeを使用することを試みることができますout lxml(pipインストールlxml)。あなたはもう少し研究を行うことになるでしょうが、効果的にそれがダウンして、このようなものになる:

from lxml import etree 

tree = etree.HTML(page_source) 
def parse_list(xpath): 
    ul = tree.xpath(xpath) 
    return [child.text for child in ul.getchildren()] 
関連する問題