我正在生成一个模型,以找出一段文本在HTML文件中的位置。
因此,我有一个数据库,其中包含来自不同报纸文章的大量数据,这些数据包括标题,发布日期,作者和新闻文本。我想做的是通过分析这些数据,生成一个模型,该模型可以自行找到具有此内容的HTML标记的XPath。
问题是,当我在xpath方法中使用正则表达式时,如下所示:
class ActionRequiredFieldsMixin:
"""Required fields per DRF action
Example:
PER_ACTION_REQUIRED_FIELDS = {
'update': ['notes']
}
"""
PER_ACTION_REQUIRED_FIELDS = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.context.get('view'):
action = self.context['view'].action
required_fields = (self.PER_ACTION_REQUIRED_FIELDS or {}).get(action)
if required_fields:
for field_name in required_fields:
self.fields[field_name].required = True
这是在代码中搜索发布日期的示例。它返回一个lxml.etree._ElementUnicodeResult而不是lxml.etree._Element。
不幸的是,在应用from lxml import html
with open('somecode.html', 'r') as f:
root = html.fromstring(f.read())
list_of_xpaths = root.xpath('//*/@*[re:match(.,"2019-04-15")]')
之后,这种类型的元素不允许我像lxml.etree._Element那样将XPath定位到它所在的位置。
有没有办法为这种类型的元素获取XPath?怎么样?
是否可以通过正则表达式返回lxml而不是返回lxml.etree._ElementUnicodeResult元素?
答案 0 :(得分:1)
问题是您得到一个表示为_ElementUnicodeResult
类实例的属性值。
如果我们内省_ElementUnicodeResult
类提供的内容,我们可以看到它允许您通过.getparent()
方法访问具有此属性的元素:
attribute = list_of_xpaths[0]
element = attribute.getparent()
print(root.getroottree().getpath(element))
这将为我们提供元素的路径,但是由于我们还需要一个属性名称,因此我们可以这样做:
print(attribute.attrname)
然后,要获取指向element属性的完整xpath,我们可以使用:
path_to_element = root.getroottree().getpath(element)
attribute_name = attribute.attrname
complete_path = path_to_element + "/@" + attribute_name
print(complete_path)
FYI,_ElementUnicodeResult
还通过.is_attribute
属性指示这是否实际上是一个属性(因为此类也表示文本节点和尾部)。