2011-12-26 19 views
2

私はコーディングの初心者で、私の友人はhtmlparserの代わりにBeautifulSoupを使用するように教えてくれました。いくつかの問題に遭遇した後、BextifulSoupの代わりにlxmlを使用するためのヒントを得ました。lxmlでHTMLデータを解析する

私は、誰かが私に探しているテキストを掻きする方法をヒントとして与えることができると願っています。私が欲しいもの

は、次の行とデータを持つテーブルを見つけることです:

<tr> 
    <td><a href="website1.com">website1</a></td> 
    <td>info1</td> 
    <td>info2</td>    
    <td><a href="spam1.com">spam1</a></td> 
</tr> 
<tr> 
    <td><a href="website2.com">website2</a></td> 
    <td>info1</td> 
    <td>info2</td>    
    <td><a href="spam2.com">spam2</a></td> 
</tr> 

にはどうすればlxmlで、スパムなしに、情報1及び2とのウェブサイトをこすり、以下の結果を得るのですか? td/a[not(contains(.,"spam"))]/@href | td[not(a)]/text()

$ python3 
>>> import lxml.html 
>>> doc = lxml.html.parse('data.xml') 
>>> [[j for j in i.xpath('td/a[not(contains(.,"spam"))]/@href | td[not(a)]/text()')] for i in doc.xpath('//tr')] 
[['website1.com', 'info1', 'info2'], ['website2.com', 'info1', 'info2']] 

答えて

1
import lxml.html as LH 

doc = LH.fromstring(content) 
print([tr.xpath('td[1]/a/@href | td[position()=2 or position()=3]/text()') 
     for tr in doc.xpath('//tr')]) 

長いXP

[['url' 'info1', 'info2'], ['url', 'info1', 'info2']] 
+0

あなたはちょうど数行のコードで私の一日を作りました。説明に感謝します。実際、すべての答えが素晴らしいです。私は火かき棒でそれを得るためにxpathについて学んでいた。しかし、彼は最初のテーブル行を見つけてその中のデータを処理するほうがはるかに簡単です。再びありがとう、メリーxマス:) – Retrace

4

は私がのXPathを使用しますathの意味は次のとおりです。

td[1]         find the first <td> 
    /a         find the <a> 
    /@href        return its href attribute value 
|          or 
td[position()=2 or position()=3]  find the second or third <td> 
    /text()        return its text value 
+0

表の行はすべて表内で同じです。私はPython 2.7.2+を使用しています。テーブルの行の中で私は最初の3つだけを望んでいます。 「[url(website1)」、「info1」、「info2」]、「url(website2)」、「info1」、「info2」]]。あなたの返信ありがとうございます – Retrace

+0

@Trees。私は 'xpath'を更新しました。 – kev

+0

実際のコンテンツにspamという言葉が含まれていないと思われるかもしれません。 @Treesだけでは、データのどの部分が一貫しているかがわかります。 – Acorn

4
import lxml.html as lh 

tree = lh.fromstring(your_html) 

result = [] 
for row in tree.xpath("tr"): 
    url, info1, info2 = row.xpath("td")[:3] 
    result.append([url.xpath("a")[0].attrib['href'], 
        info1.text_content(), 
        info2.text_content()]) 

結果:

 
[['website1.com', 'info1', 'info2'], ['website2.com', 'info1', 'info2']] 
関連する問題