2016-07-06 7 views
2

ローカルのhtmlファイルから生のhtmlを取得しようとしています。私はで読むために、生のファイルを取得するには、この記事からいくつかの助けがあった:Pythonのローカルファイルから特定のXPath内の生のすべての生のhtmlを取得する方法

Get all text inside a tag lxml

しかし、私が持っているコードは、現在のサブセットの代わりに、ファイル全体を生成します。今私は私がつかまえたいと思うxpathを選ぶことができるラインを欠いているようです。私の最終目標は、それだけでdiv要素としてローカルファイルに文字列を出力にそれを得ることができるようにすることです

def stringify_children(node): 
    from lxml.etree import tostring 
    from itertools import chain 
    parts = ([node.text] + 
      list(chain(*([c.text, tostring(c), c.tail] for c 
      in node.getchildren()))) + 
      [node.tail]) 
    # filter removes possible Nones in texts and tails 
    return ''.join(filter(None, parts)) 

for filename in os.listdir('../news/article/'): 
    if (filename.endswith('.html') and not filename.startswith('._')): 
     print filename; 
     with open('../news/article/' + filename, "r") as f: 
      page=f.read(); 
     tree=html.fromstring(page); 
     maincontent = stringify_children(tree); 
     print maincontent; 

:ここ

は、私が現在持っているコードです。

<html> 

<head> 
    <title>Title</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
</head> 

<body> 
    <div class="container"> 
     <div class="row"> 
      <div class="col-xs-4"> 
       <div class="left-bar"></div> 
      </div> 
      <div class="col-xs-4"> 
       <div class="middle-bar"></div> 
      </div> 
      <div class="col-xs-4"> 
       <div class="right-bar"></div> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="col-xs-3"> 
       <div class="navigation"></div> 
      </div> 
      <div class="col-xs-9"> 
       <div class="main-content"> 
        Hello 
        <br> 
        <br><a href="http://www.stackexchange.com">Click here to visit stack exchange</a> 
        <h1>This is an introduction</h1> 
        <h3>This is the third header</h3> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <ul> 
         <li>list text</li> 
         <li>list text</li> 
         <li>list text</li> 
         <li>list text</li> 
        </ul> 
        <div class="row"> 
         <div class="col-xs-4"><img src="#">More content 1</div> 
         <div class="col-xs-4"><img src="#">More content 2</div> 
         <div class="col-xs-4"><img src="#">More content 3</div> 
        </div> 

       </div> 
      </div> 
     </div> 
    </div> 

</body> 

</html> 

私はMainContentのクラスの下にコンテンツのすべてをつかむしたい:ここ

は、サンプルファイルです。ここでは、そのクラスのXPathがこのファイルにあります。

のXPath:/ HTML /ボディ/ DIV/DIV [2]/DIV [2]/divの

プログラムでは、出力は次の必要があります。

    Hello 
        <br> 
        <br><a href="http://www.stackexchange.com">Click here to visit stack exchange</a> 
        <h1>This is an introduction</h1> 
        <h3>This is the third header</h3> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <p>Lorem ipsum dolor sit amet.....</p> 
        <ul> 
         <li>list text</li> 
         <li>list text</li> 
         <li>list text</li> 
         <li>list text</li> 
        </ul> 
        <div class="row"> 
         <div class="col-xs-4"><img src="#">More content 1</div> 
         <div class="col-xs-4"><img src="#">More content 2</div> 
         <div class="col-xs-4"><img src="#">More content 3</div> 
        </div> 
+0

ですから、div要素自体をしたくないですか?それはあなたに壊れたHTMLを与えるでしょうあなたはそれをしたいですか? –

+0

はい。すでにタグが作成されている新しいhtmlドキュメントにデータをインポートするため、私は確信しています。 –

答えて

0

BeautifulSoupを試してみることもできます。

 Hello 
     <br/> 
<br/> <a href="http://www.stackexchange.com">Click here to visit stack exchange</a> 
<h1>This is an introduction</h1> 
<h3>This is the third header</h3> 
<p>Lorem ipsum dolor sit amet.....</p> 
<p>Lorem ipsum dolor sit amet.....</p> 
<p>Lorem ipsum dolor sit amet.....</p> 
<ul> 
<li>list text</li> 
<li>list text</li> 
<li>list text</li> 
<li>list text</li> 
</ul> 
<div class="row"> 
<div class="col-xs-4"><img src="#"/>More content 1</div> 
<div class="col-xs-4"><img src="#"/>More content 2</div> 
<div class="col-xs-4"><img src="#"/>More content 3</div> 
</div> 

:私は本当のことに精通していないんだけど、あなたはBeautifulSoupをよく読ん場合は、この(またはクリーナーのような何かを行うことができます:)

from bs4 import BeautifulSoup 
soup = BeautifulSoup(open("input.html"), 'html') 
x = soup.find_all(class_="main-content") 
for line in x[0].contents: 
    print line, 

次のような出力が得られますBeautifulSoupは、
から
への変更のようなHTML構文を「修正」し、要素内のスペースを維持します。 lxmlのを使用してhttps://www.crummy.com/software/BeautifulSoup/bs4/doc/

0

::で、その上のドキュメントを参照してください

from lxml import html 

xm = html.fromstring(h) 
div = xm.xpath("//div[@class='main-content']")[0] 
print(div.text + "".join(map(html.tostring, div.xpath("./*")))) 

または:

from lxml import html 

xm = html.fromstring(h) 
eles = xm.xpath("//div[@class='main-content']/text() | //div[@class='main-content']/*") 
print("".join([ele if isinstance(ele, str) else html.tostring(ele) for ele in eles])) 
関連する問題