解析lxml.etree.\u元素内容

2024-10-01 17:38:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我从<table>中解析出以下元素

<td align="center" valign="top">
  <a href="ConfigGroups.aspx?cfgID=451161&amp;prjID=11778&amp;grpID=DTST" 
    target="_blank">
    5548U
  </a><br/>Power La Vaca<br/>(M8025K)<br/>Linux 4.2.x.x<br/>
</td>

我试图从这个元素(包括空格)中提取“55488powerlavaca(8025K)linux4.2.x.x”。在

^{pr2}$

结果

$ python textxml.py

FAIL_1
    5548U


FAIL_2
a
    5548U

br None
br None
br None
br None
$

问题

我不得不问这个问题真是令人谦卑,因为这似乎并不难。在

如何从td_elem元素(包括空格)提取“powerlavaca(8025K)linux4.2.x.x”?在

拜托,没有regexp解决方案。在

解决方案

显式解决方案(使用芬恩的建议itertext()):

import lxml.etree as ET
td_html = """
<td align="center" valign="top">
  <a href="ConfigGroups.aspx?cfgID=451161&amp;prjID=11778&amp;grpID=DTST" 
    target="_blank">
    5548U
  </a><br/>Power La Vaca<br/>(M8025K)<br/>Linux 4.2.x.x<br/>
</td>
"""

td_elem = ET.fromstring(td_html)
print "SUCCESS", ' '.join([txt.strip() for txt in td_elem.itertext()])

Tags: brnone元素top解决方案tdamphref
2条回答

我知道一定有更好的办法,但这是有效的。在

link = td_elem.find('a').text.strip()
text = ''.join(td_elem.itertext()).strip()
text.split(link)[1]

输出是Power La Vaca(M8025K)Linux 4.2.x.x

更新: 如果你想用空格来代替那些<br>,这实际上更好

^{pr2}$

实际上,mapstr并不需要它,但是我可以想象其他值。在

在使用XML时,即使在Python中,我也喜欢尝试使用可用的特定于域的工具。对于解析XML片段,XPath适合我。在

>>> td_elem = ET.fromstring(td_html)
>>>
>>> # Use XPath to grab just the text nodes under <td/>, 
>>> # ignoring any text nodes in child nodes of <td/> (i.e., <a...>5548U</a>)
>>> print(td_elem.xpath('/td/text()'))
['\n  ', 'Power La Vaca', '(M8025K)', 'Linux 4.2.x.x', '\n']
>>>
>>> # Make it a little cleaner
>>> ' '.join(x.strip() for x in td_elem.xpath('/td/text()'))
' Power La Vaca (M8025K) Linux 4.2.x.x '
>>>
>>> # Just for reference, grab all text nodes with '//'
>>> ' '.join(x.strip() for x in td_elem.xpath('/td//text()'))
' 5548U Power La Vaca (M8025K) Linux 4.2.x.x '

相关问题 更多 >

    热门问题