使用散布的粗体标签从HTML中提取文本,保留顺序

时间:2017-03-02 14:52:08

标签: python xpath

我正在尝试从以下结构的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

这样做我得到所有粗体标签的内部文本,我也可以使用string()包装器获取pre的整个内部文本。

然而,我正在努力做的是得到如下结果:

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

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

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

如果我正确理解你的问题,你想忽略html结构并提取列表中的文本片段,每个列表元素都是一个不包含任何标签的字符串。

通常使用正则表达式来解析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']