【问题标题】:Python lxml html xpath regex parsing [duplicate]Python lxml html xpath正则表达式解析[重复]
【发布时间】:2017-07-01 12:59:41
【问题描述】:

我在 Python 3.6 中的 lxml etree.XPath 表达式中使用正则表达式时遇到问题

在此示例中,我在 stackoverflow 主页上搜索被空格包围的 4 位数字。并返回该元素的xpath

我得到的匹配只是空白。我似乎无法过滤掉它们。我的感觉是,这可能是一些编码问题,但不能指望它......

下图来自https://regex101.com/。正确地给了我 1 场比赛。

这里是主页 html 的链接: https://drive.google.com/open?id=0B3HIB_5rVAxmZU9ialZHdzhscE0

这是我的代码

from lxml import html
from lxml import etree

with open('stackoverflow.html', 'r', encoding='utf8') as f:
    page_html = f.read()

html_tree = html.fromstring(page_html)

regexpNS = "http://exslt.org/regular-expressions"
find = etree.XPath("//*[re:test(., '(\s\d{4}\s)', 'i')]",
                       namespaces={'re':regexpNS})

tree = etree.fromstring(page_html)
tree = etree.ElementTree(tree)
for element in find(tree):
    text = str(element.text)
    str(text).strip()
    if text != '':
        print(text)
        print(len(text))
        print(tree.getpath(element))
        print('##############################################################')

输出

    None
    4
    / *
    ##############################################################

    13
    / * / *[2]
    ##############################################################

    13
    / * / *[2] / * [8]
    ##############################################################

    17
    / * / *[2] / * [8] / *
    ##############################################################

    21
    / * / *[2] / * [8] / * / *
    ##############################################################

    25
    / * / *[2] / * [8] / * / * / * [18]
    ##############################################################

    29
    / * / *[2] / * [8] / * / * / * [18] / *
    ##############################################################

    33
    / * / *[2] / * [8] / * / * / * [18] / * / * [2]
    ##############################################################
    site
    design / logo © 2017
    Stack
    Exchange
    Inc;
    user
    contributions
    licensed
    under
    117
    / * / *[2] / * [8] / * / * / * [18] / * / * [2] / *
    ##############################################################

应该去掉len > 0 的空白文本行怎么回事???

谢谢!

【问题讨论】:

  • 嗯...没有人解释为什么我得到 xpath 正则表达式的多个结果...解决方法就足够了。根本问题与其重复的原因不同。反正我觉得没关系。

标签: python html regex xpath lxml


【解决方案1】:

str.strip 返回一个剥离的文本,但不会更改 text

>>> text = '    a    '
>>> text.strip()   # returns a new string
'a'
>>> text  # `text` is not changed
'    a    '

如果要更改text,则需要将上述表达式的返回值重新分配回text(顺便说一句,您不需要调用str(..),因为text已经是str对象:

str(text).strip()

应替换为:

text = text.strip()

【讨论】:

  • 啊,字符串是不可变的?这就是为什么?是的,我看到了,但我试图把它塞进一种类型,因为它很奇怪......
  • @JamesSchinner,是的,字符串在 python 中是不可变的。
  • 是的,这解决了我的问题。我现在可以过滤掉空白。那谢谢啦!不过,我仍然不知道为什么我会得到空白匹配,甚至是 None 类型。
  • @JamesSchinner,因为它被转换为字符串'None'(因为str(element.text)。你可以在for ...下方过滤掉它:if element.text is None: continue
  • None 不是 None 它是“None” - 已解决。干杯伙伴!
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2011-01-23
  • 2012-09-12
  • 2018-04-29
  • 2016-06-15
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多