【问题标题】:Parsing html table data with break tags in lxml用lxml中的break标签解析html表数据
【发布时间】:2016-12-14 02:57:07
【问题描述】:

当我从记事本复制粘贴数据到单元格时,外部应用程序会在我的 HTML 表格数据中添加中断标记

<tr>
<td>3.7.4</td>
<td>12133<br />43434<br />65465<br />66656</td>
<td>test</td>
</tr>

我无法使用 lxml 解析,在下面添加整个 html

    <table class="j-table jiveBorder" style="border: 1px solid #c6c6c6;" width="100%">
<thead>
<tr style="background-color: #efefef;">
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>3.7.4</td>
<td>12133<br />43434<br />65465<br />66656</td>
<td>test</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

我用来解析这些数据的代码

for tr in table.findall('.//tbody/tr'):    
    data = []  
    data.append([x.text for x in tr[1]])
    print (data)

当没有中断标记并且所有值都在内部时,代码可以完美运行,例如&lt;p&gt;12133&lt;/p&gt;标签

【问题讨论】:

  • 为什么不能解析?你收到错误信息吗?始终显示有问题的完整错误消息(Traceback)。
  • @furas - 没有这样的错误消息,问题是它只解析第一个元素,即 12133 并跳过其他值

标签: python html lxml elementtree


【解决方案1】:

您可以使用itertext()

data = '''<table class="j-table jiveBorder" 
style="border: 1px solid #c6c6c6;" width="100%">
<thead>
<tr style="background-color: #efefef;">
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>3.7.4</td>
<td>12133<br />43434<br />65465<br />66656</td>
<td>test</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>'''

import lxml.html

soup = lxml.html.fromstring(data)

for tr in soup.xpath('//tbody/tr'):
    print([x for x in tr[1].itertext()])

返回

['12133', '43434', '65465', '66656']
[]

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多