我有一个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'})
这给了我跨距对象的列表,但我不知道如何在两个跨距之间进行迭代。
有什么建议吗?