span标记后的XML标题

时间:2016-01-26 08:14:28

标签: python python-2.7 xpath itertools

我有一个XML文件,我想从中提取</span> <span class='classy'>标签之间的标题标签(h1,h2,..及其文本)(这种方式)。我想在Python 2.7中做到这一点,我尝试过beautifulsoup和elementtree但是无法解决这个问题。 该文件包含以下部分:

<section>
    <p>There is some text <span class='classy' data-id='234'></span> and there is more text now.</p> 
    <h1>A title</h1>
    <p>A paragraph</p>
    <h2>Some second title</h2>
    <p>Another paragraph with random tags like <img />, <table> or <div></p>
    <div>More random content</div>
    <h2>Other title.</h2>
    <p>Then more paragraph <span class='classy' data-id='235'></span> with other stuff.</p>
    <h2>New title</h2>
    <p>Blhablah, followed by a div like that:</p>
    <div class='classy' data-id='236'></div>
    <p>More text</p>
    <h3>A new title</h3>
</section>

我想写一个像这样的csv文件:

data-id,heading.name,heading.text
234,h1,A title
234,h2,Some second title
234,h2,Another title.
235,h2,New title
236,h3,A new title

理想情况下我会这样写:

id,h1,h2,h3
234,A title,Some second title, 
234,A title,Another title, 
235,A title,New title, 
236,A title,New title,A new title

但我想我之后总能重新塑造它。

我试图遍历文件,但我似乎只能保留所有没有标题标签的文本。另外,为了让事情变得更烦人,有时它不是一个跨度而是一个div,它具有相同的类和属性。

有关Python最佳工具的建议吗?

我有两段有效的代码: - 使用itertools.takewhile查找文本 - 找到所有h1,h2,h3但没有跨度id。

soup = BeautifulSoup(open(xmlfile,'r'),'lxml')
spans = soup('span',{'class':'page-break'})
for el in spans:
    els = [i for i in itertools.takewhile(lambda x:x not in [el,'script'],el.next_siblings)]
    print els

这为我提供了跨度之间包含的文本列表。我想迭代它,但没有更多的html标签。

找到我使用的h1,h2,h3:

with open('titles.csv','wb') as f:
    csv_writer = csv.writer(f)
    for header in soup.find_all(['h1','h2','h3']):
        if header.name == 'h1':
            h1text = header.get_text()
        elif header.name == 'h2':
            h2text = header.get_text()
        elif header.name == 'h3':
            h3text = header.get_text()
        csv_writer.writerow([h1text,h2text,h3text,header.name])

我现在尝试使用xpath而没有太多运气。 由于它是一个xhtml文档,我使用了:

from lxml import etree
with open('myfile.xml', 'rt') as f:
    tree = etree.parse(f)
    root = tree.getroot()
spans = root.xpath('//xhtml:span',namespaces={'xhtml':'http://www.w3.org/1999/xhtml'})

这给了我跨距对象的列表,但我不知道如何在两个跨距之间进行迭代。

有什么建议吗?

0 个答案:

没有答案