根据术语列表从树中删除元素
Remove elements from tree based on list of terms
我正在尝试从网页(在 运行 脚本时传递其 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)
在您的代码中,elem
是一个具有实例方法 getparent
的 _ElementStringResult
。它的父节点是 <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.
结构的更多信息
我正在尝试从网页(在 运行 脚本时传递其 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)
在您的代码中,elem
是一个具有实例方法 getparent
的 _ElementStringResult
。它的父节点是 <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.
结构的更多信息