2017-03-02 16 views
0

我试图从以下结构的HTML文件中的文本:从HTML中提取文本穿插着大胆的标签,维持秩序

<td class='srctext> 
<pre> 
    <b> Heading 1 </b> 
    text 
    more text 
    <b> Heading 2 </b> 
    even more text, 
    <b> also some bold text </b> 
    and the last text 
</pre> 

要做到这一点我使用XPath的,像

//td[@class='srctext]/pre/b 

这样做我得到的所有粗体标记的内部文本,我也可以得到预先的整个内部文本,通过使用字符串()包装。

但是我很努力做的,越来越像一个结果:

[ 
    'Heading 1', 
    'text \n more text', 
    'Heading 2', 
    'even more text', 
    ... 
] 

请不要犹豫,问,如果有不清楚的地方。

回答

0

尝试//td[@class='srctext']/pre//text()[normalize-space()]作为XPath(假设您有完整的XPath 1.0支持,例如lxml和不受限制的ElementTree XPath支持)。

完整的例子就是

from lxml import etree as ET 
html = '''<html><body><table><tr><td class=srctext> 
<pre> 
    <b> Heading 1 </b> 
    text 
    more text 
    <b> Heading 2 </b> 
    even more text, 
    <b> also some bold text </b> 
    and the last text 
</pre> 
</body> 
</html>''' 

htmlEl = ET.HTML(html) 
textValues = htmlEl.xpath("//td[@class='srctext']/pre//text()[normalize-space()]") 
print(textValues) 

和输出

[' Heading 1 ', '\n text\n more text\n ', ' Heading 2 ', '\n even more text, \n ', ' also some bold text ', '\n and the last text\n'] 
0

如果我正确理解你的问题,你要忽略HTML struture并在列表中提取文本的碎片,每个列表元素是一个不包含任何标签的字符串。

通常使用正则表达式来解析XML或HTML是一个可怕的想法,但这个问题是它的一个罕见用例。假定您已经阅读所有的文件在一个单一的字符串:

[ i.strip() for i in re.findall(r'(.*?)<.*?>', t, re.DOTALL) if len(i.strip()) > 0] 

给出预期:

['Heading 1', 'text\n more text', 'Heading 2', 'even more text,', 'also some bold text', 'and the last text']