2017-09-06 5 views
2

必要な項目(各グループに共通)をループする際に選択するコンテナまたはグループがない場合の対処法はありますか?私はペーストされた要素からテキスト、日付、および著者を解析したいと思います。後の3つの結果は特定のグループやコンテナに属していないため、ループを作成する正しい方法を見つけることができません。ここでいくつかの要素から特定の項目を削り取ることができません

は要素です:

html = ''' 
<div class="view-content">    
    <p class="text-large experts-more-h"> 
    <a href="/publications/commentary/we-have-no-idea-universal-preschool-actually-helps-kids">We Have No Idea if Universal Preschool Actually Helps Kids</a> 
    </p> 
    <p class="text-sans">  
    By David J. Armor. Washington Post. <span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="2014-10-21T09:34:00-04:00">October 21, 2014</span>. 
    </p>   
    <p class="text-large experts-more-h"> 
    <a href="/publications/commentary/last-parent-resistance-collective-standardized-tests">At Last, Parent Resistance to Collective Standardized Tests</a> 
    </p> 
    <p class="text-sans">  
    By Nat Hentoff. Cato.org. <span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="2014-01-15T09:57:00-05:00">January 15, 2014</span>. 
    </p> 
    <p class="text-sans">  
    By Darcy Ann Olsen and Eric Olsen. Cato.org. <span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="1999-04-15T00:00:00-04:00">April 15, 1999</span>. 
    </p>  
    <p class="text-large experts-more-h"> 
    <a href="/publications/commentary/day-care-parents-versus-professional-advocates-0">Day Care: Parents versus Professional Advocates</a> 
    </p> 
    <p class="text-sans"> 
    By Darcy Ann Olsen. Cato.org. <span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="1998-06-01T00:00:00-04:00">June 1, 1998</span>. 
    </p> 
</div> 
''' 

あなたが私のスクリプトを実行する場合は、あなたが掻き取った結果は最初の1であることがわかります。

from lxml.html import fromstring 

tree = fromstring(html) 
post= tree.cssselect(".text-large a")[0].text 
date = tree.cssselect(".date-display-single")[0].text 
author = tree.cssselect(".text-sans")[0].text.strip() 
print(post+'\n', date+'\n', author) 

結果:

We Have No Idea if Universal Preschool Actually Helps Kids 
October 21, 2014 
By David J. Armor. Washington Post. 

このスクリプトを実行すると、このスクリプトが私が行ったすべての結果を解析できることがわかります:

from lxml.html import fromstring 

tree = fromstring(html) 
count = tree.cssselect(".text-large a") 

for item in range(len(count)): 
    post= tree.cssselect(".text-large a")[item].text 
    date = tree.cssselect(".date-display-single")[item].text 
    author = tree.cssselect(".text-sans")[item].text.strip() 
    print(post+'\n', date+'\n', author) 

結果:

We Have No Idea if Universal Preschool Actually Helps Kids 
October 21, 2014 
By David J. Armor. Washington Post. 
At Last, Parent Resistance to Collective Standardized Tests 
January 15, 2014 
By Nat Hentoff. Cato.org. 
Day Care: Parents versus Professional Advocates 
April 15, 1999 
By Darcy Ann Olsen and Eric Olsen. Cato.org. 

しかし、私は私の2番目のスクリプトでやったことは、まったくPython的ではなく、任意のデータが欠落している場合、それは間違った結果が得られます。だから、どのようにグループやコンテナを選択し、それをループして、それらのすべてを解析するのですか?前もって感謝します。

+0

することも可能ですか? – Andersson

+0

@ Andersson、私のスレッドであなたを持つことは、いつも大きな喜びです。 xpathまたはcssセレクタになってください。これらのほとんどは私があなたから学んだものです。どのような解決策もあなたの目的から成り立ちます。 Btw、私はCSSのセレクタにいくつかの制限があることがわかりますが、私はそれを非常に気に入っています.. – SIM

+0

あなたは、*データが欠落していると間違った結果を出すでしょう* ...あなたはHTMLソースが異なる?この場合にもHTMLを共有できますか? – Andersson

答えて

1

テキストノード(postdateauthor)のいずれかが欠落している場合、tree.cssselect(selector)[index].textは、あなたが文字列として扱うことができないNoneTypeオブジェクトを返す必要があります。これはあなたが

post= tree.cssselect(".text-large a")[item].text or " " 

を実装することができます。また、XPathソリューションの下に試すことができないようにするには:あなたはCSSの唯一の解決策かのXPathを検索ください

container = tree.cssselect(".text-large") 

for item in container: 
    post = item.xpath('./a')[0].text or " " 
    date = item.xpath('./following-sibling::p/span[@class="date-display-single"]')[0].text or " " 
    author = item.xpath('./following-sibling::p[@class="text-sans"]')[0].text.strip() or " " 
    print(post+'\n', date+'\n', author) 
+0

これは、「[item] .textまたは "" "も同様に使用できることを意味します。これは私にとって初めてのことです。 – SIM

+1

これは三項条件演算子の短いバージョンです: '[item] .text if [item] .text else" "' – Andersson

+0

これは知っておいて大変です。私はそれが間違っていることを感じたので、私はそれを避けたが、次回は試してみる。ありがとう。 – SIM

関連する問題