2017-11-21 3 views
1

私は、lxmlライブラリを使用して、収集したHTMLデータを解析しようとしています。ほとんどの場合、必要な値を抽出して成功した結果が得られましたが、私のコードではテキストデータの中にあるURLが抽出されないようです。以下のコードは、私が難しかった特定の値の単なる一例です。いくつかの値は文字だけで表示され、他の文字は文字で表示されます。 text()引数の代わりに、URLのテキストが含まれていますか?これまでの結果のPythons lxml text()の引数を使用するときにテキストデータにURLを含める方法

import lxml 
import json 
from lxml import etree 
from lxml.html.clean import Cleaner 
try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 

    with open('items.json') as data_file:  
    html = json.load(data_file) 
    html_parser = lxml.etree.HTMLParser() 

    for entry in html: 
     url = str(entry.get('url', '')) 
     field = str(entry.get('field1', '')) 

     html_parsed = lxml.etree.parse(StringIO(field), html_parser) 
     for table in html_parsed.xpath('//td/table'): 
      for row in table.xpath('.//tr'): 
       value = (row.xpath('.//td/text()')) 
        if "Homepage :" in value: 
         print(url) 
         print(value) 

例:

サンプルHTMLデータ:

<td align="right">Homepage :</td><td align="left"><a href="http://www.example.com" target="_blank">www.example.com</a></td> 

結果が返さ:

['Homepage :'] 

サンプルHTMLデータ:

<td align="right">Homepage :</td><td align="left">http://workingexample.com/</td> 

結果が返さ:

['Homepage :', 'http://workingexample.com/'] 

ソリューション私は2番目の例のように私は必要なデータを得ることができるようにもいただければ幸いです:)

答えて

0

まずテキスト「のホームページをチェックしているTD 」にはURLが含まれていないため、正しい行にあることを確認するためにのみ使用できます(詳細は後で詳しく説明します)。

第2に、hrefはタグの属性です。このタグのtext()は画面上に表示されるコンテンツに過ぎません。これは何でもかまいません。 あなたがタグの属性にアクセスする必要があるURLを取得したい場合は、次のように、最も簡単な方法は次のとおりです。

if "Homepage :" in value: 
    url = row.xpath('.//td/a/@href') 

@hrefaない子の属性であることを示しています。したがって、td内のaタグのhrefが返されます。

.//td[text()[contains(.,'Homepage')]]/following-sibling::td[1]/a/@href 
:あなたは、その行の中の複数の aのタグを持っている場合

最初の問題は、今私は、XPathの専門家でないんだけど、私は次のように動作するはずだと思う、問題になる可能性があり(これはvalue = (row.xpath('.//td/text()'))を置き換えます)

私はそれがテキストコンテンツでHomepageを持っているtdを見つける必要があります間違っていない場合は、最初の([1])を求めるatdを次し、それからhref属性をつかみます。

関連する問題