Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据术语列表从树中删除元素_Python_Html_Lxml - Fatal编程技术网

Python 根据术语列表从树中删除元素

Python 根据术语列表从树中删除元素,python,html,lxml,Python,Html,Lxml,我试图从网页(运行脚本时会传递其URL)捕获一些文本,但这些文本隐藏在段落标记中,没有指定其他属性。我可以收集每个段落标记的内容,但我想从树中删除包含任何关键字列表的任何元素 我得到以下错误: tree.remove(elem)类型错误:参数“element”的类型不正确 (应为lxml.etree._元素,获得_元素StringResult) 我知道当我尝试遍历树时得到的是错误的类型,但是如何取而代之的是元素呢 示例代码: #!/usr/bin/python from lxm

我试图从网页(运行脚本时会传递其URL)捕获一些文本,但这些文本隐藏在段落标记中,没有指定其他属性。我可以收集每个段落标记的内容,但我想从树中删除包含任何关键字列表的任何元素

我得到以下错误:

tree.remove(elem)类型错误:参数“element”的类型不正确 (应为lxml.etree._元素,获得_元素StringResult)

我知道当我尝试遍历树时得到的是错误的类型,但是如何取而代之的是元素呢

示例代码:

    #!/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
两次;第一次获取
节点,第二次获取其父节点。