Python 根据术语列表从树中删除元素
我试图从网页(运行脚本时会传递其URL)捕获一些文本,但这些文本隐藏在段落标记中,没有指定其他属性。我可以收集每个段落标记的内容,但我想从树中删除包含任何关键字列表的任何元素 我得到以下错误: tree.remove(elem)类型错误:参数“element”的类型不正确 (应为lxml.etree._元素,获得_元素StringResult) 我知道当我尝试遍历树时得到的是错误的类型,但是如何取而代之的是元素呢 示例代码:Python 根据术语列表从树中删除元素,python,html,lxml,Python,Html,Lxml,我试图从网页(运行脚本时会传递其URL)捕获一些文本,但这些文本隐藏在段落标记中,没有指定其他属性。我可以收集每个段落标记的内容,但我想从树中删除包含任何关键字列表的任何元素 我得到以下错误: tree.remove(elem)类型错误:参数“element”的类型不正确 (应为lxml.etree._元素,获得_元素StringResult) 我知道当我尝试遍历树时得到的是错误的类型,但是如何取而代之的是元素呢 示例代码: #!/usr/bin/python from lxm
#!/usr/bin/python
from lxml import html
from lxml import etree
url = sys.argv[1]
page = requests.get(url)
tree = html.fromstring(page.content)
terms = ['keyword1','keyword2','keyword3','keyword4','keyword5','keyword6','keyword7']
paragraphs = tree.xpath('//p/text()')
for elem in paragraphs:
if any(term in elem for term in terms):
tree.remove(elem)
在您的代码中,
elem
是一个包含实例方法getparent
。它的父元素是一个
节点的元素
对象
父级有一个remove
方法,可用于将其从树中删除:
element.getparent().remove(element)
我不相信有更直接的方法,对于为什么没有removeself
方法,我也没有一个好的答案
使用示例html:
content = '''
<root>
<p> nothing1 </p>
<p> keyword1 </p>
<p> nothing2 </p>
<p> nothing3 </p>
<p> keyword4 </p>
</root>
'''
content=''
什么都没有
关键词1
什么都没有
什么都没有
关键词4
'''
您可以通过以下方式在代码中看到这一点:
from lxml import html
from lxml import etree
tree = html.fromstring(content)
terms = ['keyword1','keyword2','keyword3','keyword4','keyword5','keyword6','keyword7']
paragraphs = tree.xpath('//p/text()')
for elem in paragraphs:
if any(term in elem for term in terms):
actual_element = elem.getparent()
actual_element.getparent().remove(actual_element)
for child in tree.getchildren():
print('<{tag}>{text}</{tag}>'.format(tag=child.tag, text=child.text))
# Output:
# <p> nothing1 </p>
# <p> nothing2 </p>
# <p> nothing3 </p>
从lxml导入html
从lxml导入etree
tree=html.fromstring(内容)
术语=['keyword1'、'keyword2'、'keyword3'、'keyword4'、'keyword5'、'keyword6'、'keyword7']
段落=tree.xpath(“//p/text()”)
对于段落中的元素:
如有(以要素表示的术语,以术语表示的术语):
实际_元素=elem.getparent()
实际\u元素。getparent().remove(实际\u元素)
对于树中的子级。getchildren()
打印({text}.format(tag=child.tag,text=child.text))
#输出:
#什么都没有1
#什么都没有2
#什么都没有
从评论来看,这段代码似乎不适合您。如果是这样,您可能需要提供有关html结构的详细信息。可能的重复项我无法获取_ElementStringResult的父项,因为getparent()需要一个_元素。@user2912466是否尝试过?我这样做了,但解决方案带来了两个问题:首先,它抱怨元素不是节点的子元素,因为树中每个段落标记的父元素都是“”,但它只捕获第一个单词。其次,这个例子只有在有一个段落标记的情况下才有效,但是我捕获了所有的段落标记,然后删除了特定的段落标记。在本例中,body起作用是因为只有一个body,所以当您删除该元素时,其他元素都不会消失。但是如果我
p.getparent().remove(p)
,它将删除所有段落元素。我该怎么处理呢?@user2912466它不会删除所有元素,它只会删除p
@user2912466查看更新的答案,我想你需要调用getparent
两次;第一次获取
节点,第二次获取其父节点。