Python 从变量中删除值的最佳方法?创建数组,还是使用正则表达式?还是使用Xpath?

Python 从变量中删除值的最佳方法?创建数组,还是使用正则表达式?还是使用Xpath?,python,regex,arrays,xpath,Python,Regex,Arrays,Xpath,我试图用以下代码从问题末尾的输出中提取一些字段: doc = LH.fromstring(html2) tds = (td.text_content() for td in doc.xpath("//td[not(*)]")) for a,b,c in zip(*[tds]*3): print (a,b,c) 我希望只提取字段notificationNodeName、notificationNodeName、packageName、notificationEnabled 这样做的主要

我试图用以下代码从问题末尾的输出中提取一些字段:

doc = LH.fromstring(html2)
tds = (td.text_content() for td in doc.xpath("//td[not(*)]"))

for a,b,c in zip(*[tds]*3):
    print (a,b,c)
我希望只提取字段notificationNodeName、notificationNodeName、packageName、notificationEnabled

这样做的主要问题是,我想将结果放入数据库。而我需要接受的是:

实际代码返回:

('JDBCAdapter', 'JDBCAdapter', 'Package:Notif')
('Package', 'yes', 'Package_2:Notif')
('Package_2', 'yes')
我需要的是:

('Package:Notif','Package', 'yes')
('Package_2:Notif','Package_2', 'yes')
我发现了一个非常糟糕的解决方案:

doc = LH.fromstring(html2)
tds = (td.text_content() for td in doc.xpath("//td"))

for td, val in zip(*[tds]*2):
    if td == 'notificationNodeName':
        notificationNodeName = val
    elif td == 'packageName':
        packageName = val
    elif td == 'notificationEnabled':
        notificationEnabled = val
        print (notificationNodeName,packageName,notificationEnabled)
它确实有效,但对我来说并不合适,我相信这是一个更好的方法

原始HTML输出:

<tbody><tr>
<td valign="top"><b>adapterTypeName</b></td>
<td>JDBCAdapter</td>
</tr>
<tr>
<td valign="top"><b>adapterTypeNameList</b></td>
<td>
<table>
<tbody><tr>
<td>JDBCAdapter</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td valign="top"><b>notificationDataList</b></td>
<td>
<table>
<tbody><tr>
<td><table bgcolor="#dddddd" border="1">
<tbody><tr>
<td valign="top"><b>notificationNodeName</b></td>
<td>package:Notif</td>
</tr>
<tr>
<td valign="top"><b>packageName</b></td>
<td>Package</td>
</tr>
<tr>
<td valign="top"><b>notificationEnabled</b></td>
<td>unsched</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td><table bgcolor="#dddddd" border="1">
<tbody><tr>
<td valign="top"><b>notificationNodeName</b></td>
<td>Package_2:notif</td>
</tr>
<tr>
<td valign="top"><b>packageName</b></td>
<td>package_2</td>
</tr>
<tr>
<td valign="top"><b>notificationEnabled</b></td>
<td>yes</td>
</tr>

and continues to more ... non relevant repetitive data.

适配器类型名
JDBCAdapter
适配器类型名称列表
JDBCAdapter
通知数据列表
通知节点名称
包装:Notif
包装名称
包裹
通知启用
毫发无损
通知节点名称
包装2:不适用
包装名称
包装2
通知启用
对
并且继续增加。。。非相关重复数据。

我建议使用优秀的lxml及其cssselect功能进行基本上大多数HTML解析

然后,您可以选择您感兴趣的每个字段:

from lxml import html
root = html.parse(open('your/file.html')).getroot()

sibling_content = lambda x: [b.getparent().getnext().text_content() for b in
                             root.cssselect("td b:contains('{0}')".format(x))]

fields = ['notificationNodeName', 'packageName', 'notificationEnabled']

for item in zip(*[sibling_content(field) for field in fields]):
    print item

我还推荐lxml——它是用Python解析XML或HTML的事实标准

作为David方法的替代方案,这里有一个使用XPath的解决方案:

from lxml import html
from lxml import etree


html_file = open('test.html', 'r')
root = html.parse(html_file).getroot()

# Strip those annoying <b> tags for easier xpaths
etree.strip_tags(root,'b')

data_list = root.xpath("//td[text()='notificationDataList']/following-sibling::*")[0]

node_names = data_list.xpath("//td[text()='notificationNodeName']/following-sibling::*/text()")
package_names = data_list.xpath("//td[text()='packageName']/following-sibling::*/text()")
enableds = data_list.xpath("//td[text()='notificationEnabled']/following-sibling::*/text()")

print zip(node_names, package_names, enableds)

我很少看到使用xpath比使用BeautifulSoup更容易解决的问题。(事实上,我从来没有想过xpath应该适合哪类问题)。非常感谢,但是我如何才能将html2变量添加到root=html.parse(open('your/file.html')).getroot()中呢?当我运行它时,我得到了文件未找到的正常错误Thales Pereira 13分钟前假设这个变量是一个字符串,有一个替代API,它是:root=html.fromstring(html2)lxml的完整API文档:谢谢你,对你的懒散表示抱歉,我在回复后几分钟找到它,搜索API文档:)
[('package:Notif', 'Package', 'unsched'),
 ('Package_2:notif', 'package_2', 'yes')]