tcp*_*008 3 html python parsing lxml
我正在转换一些使用正则表达式的python脚本来将内容从html输出提取到libxml2,但是从我开始这个时候,一点帮助就会被贬低.
我如何使用lxml从示例下面的"工作目录","包/更新"和"Java数据模型"中提取值?
<tr>
<script>writeTD("row");</script>
<td class="oddrow"><nobr>Working Dir</nobr></td>
<script>writeTD("rowdata-l");</script>
<td class="oddrowdata-l">/serves/test_servers</td>
</tr>
<script>swapRows();</script>
<tr>
<script>writeTD("row");</script>
<td class="evenrow"><nobr>Packages/Updates</nobr></td>
<script>writeTD("rowdata-l");</script>
<td class="evenrowdata-l"><a href="updates.dsp">View</a></td>
</tr>
<script>swapRows();</script>
<tr>
<script>writeTD("row");</script>
<td class="oddrow"><nobr>Java Data Model</nobr></td>
<script>writeTD("rowdata-l");</script>
<td class="oddrowdata-l">64-bit</td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
Run Code Online (Sandbox Code Playgroud)
提前致谢.
使用您发布的HTML content,
import lxml.html as LH
doc = LH.fromstring(content)
tds = (td.text_content() for td in doc.xpath('//td'))
for td, val in zip(*[tds]*2):
if td in ("Working Dir", "Java Data Model"):
print(td,val)
Run Code Online (Sandbox Code Playgroud)
产量
('Working Dir', '/serves/test_servers')
('Java Data Model', '64-bit')
Run Code Online (Sandbox Code Playgroud)
这条线完成了大部分工作:
tds = (td.text_content() for td in doc.xpath('//td'))
Run Code Online (Sandbox Code Playgroud)
它使用该xpath()方法搜索所有<td>标签.它使用该text_content()方法提取相关文本.
zip(*[tds]*2)是成对迭代的石斑鱼成语tds:
for td, val in zip(*[tds]*2):
print(td,val)
Run Code Online (Sandbox Code Playgroud)
请注意,这假设<td>标签和值交替相互跟随.