我正在尝试从以下结构的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',
...
]
如果有任何不清楚的地方,请不要犹豫。
答案 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']