将root.xpath()与正则表达式一起应用将返回lxml.etree._ElementUnicodeResult

时间:2019-04-18 19:11:48

标签: python regex html-parsing lxml

我正在生成一个模型,以找出一段文本在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元素?

1 个答案:

答案 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属性指示这是否实际上是一个属性(因为此类也表示文本节点和尾部)。