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

2024-05-02 08:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我得到以下错误:

tree.remove(elem) TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got _ElementStringResult)

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

样本代码:

    #!/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) 

Tags: infromimporttreeurl元素html错误
1条回答
网友
1楼 · 发布于 2024-05-02 08:07:42

在您的代码中,elem是一个^{},它具有实例方法getparent。它的父节点是Element节点之一的Element对象。在

父级有一个remove方法,可用于将其从树中删除:

element.getparent().remove(element)

我不相信有更直接的方法,我也没有一个好的答案为什么没有removeself方法。在

使用示例html:

^{pr2}$

您可以在代码中看到这一点:

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>

从评论来看,这段代码似乎不适合你。如果是这样,您可能需要提供有关html结构的更多信息。在

相关问题 更多 >