如何从Python中的本地文件获取特定XPath中的所有原始html

如何从Python中的本地文件获取特定XPath中的所有原始html,python,lxml,lxml.html,Python,Lxml,Lxml.html,我试图从一堆本地html文件中获取原始html。我从这篇文章中得到了一些帮助,可以读入原始文件: 但是我现在使用的代码生成了整个文件,而不是一个子集。现在,我似乎遗漏了一行,在这里我可以选择一个我想要获取的xpath 以下是我目前拥有的代码: def stringify_children(node): from lxml.etree import tostring from itertools import chain parts = ([node.text] +

我试图从一堆本地html文件中获取原始html。我从这篇文章中得到了一些帮助,可以读入原始文件:

但是我现在使用的代码生成了整个文件,而不是一个子集。现在,我似乎遗漏了一行,在这里我可以选择一个我想要获取的xpath

以下是我目前拥有的代码:

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;
我的最终目标是能够以字符串的形式获取它,并将其作为唯一的div输出到本地文件

以下是一个示例文件:

<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>

标题
你好


这是一个介绍 这是第三个标题 Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

  • 列表文本
  • 列表文本
  • 列表文本
  • 列表文本
更多内容1 更多内容2 更多内容3
我想获取maincontent类下面的所有内容。以下是该文件中该类的xpath:

XPath:/html/body/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>
你好

这是一个介绍 这是第三个标题 Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

  • 列表文本
  • 列表文本
  • 列表文本
  • 列表文本
更多内容1 更多内容2 更多内容3
您可以尝试使用BeautifulSoup。我对它不是很精通,但你可以这样做(或者更干净,如果你读了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>
你好

这是一个介绍 这是第三个标题 Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet

  • 列表文本
  • 列表文本
  • 列表文本
  • 列表文本
更多内容1 更多内容2 更多内容3 BeautifulSoup将“修复”HTML语法,如从

的更改,并将保持元素内部的间距。使用lxml查看其上的文档:

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("./*"))))
或:


所以你不想要这个div本身?那会给你坏掉的html你确定你想要吗?是的。我确信,因为我将把数据导入到一个已经创建了该标记的新html文档中。
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]))