繁体   English   中英

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

[英]Remove elements from tree based on list of terms

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

我收到以下错误:

tree.remove(elem)TypeError:参数'element'具有错误的类型(预期为lxml.etree._Element,得到了_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) 

在您的代码中, elem是一个_ElementStringResult ,它具有实例方法getparent 它的父级是<p>节点之一的Element对象。

父级具有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>
'''

您可以通过以下方式在代码中看到这一点:

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结构的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM