[英]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.