簡體   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