Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml-使用findall()中的正则表达式按属性值查找标记_Python_Html_Lxml - Fatal编程技术网

Python lxml-使用findall()中的正则表达式按属性值查找标记

Python lxml-使用findall()中的正则表达式按属性值查找标记,python,html,lxml,Python,Html,Lxml,我正试图使用lxml来获取一个格式化为 <div id="comment-1"> TEXT </div> <div id="comment-2"> TEXT </div> <div id="comment-3"> TEXT </div> ... 但它会搜索一个文字星号 我要做的事情的正确语法是什么 编辑:我终于通过这样做让它工作起来了 doc = lxml.html.parse(url).getroot()

我正试图使用lxml来获取一个格式化为

<div id="comment-1">
  TEXT
</div>

<div id="comment-2">
  TEXT
</div>

<div id="comment-3">
  TEXT
</div>
...
但它会搜索一个文字星号

我要做的事情的正确语法是什么

编辑:我终于通过这样做让它工作起来了

doc = lxml.html.parse(url).getroot()
comment_array = doc.xpath('.//div[starts-with(@id, "comment-")]')

中的
路径
部分仅允许用作表达式,默认情况下不使用正则表达式


要做到这一点,您必须使用所述的扩展名
EXSLT
,或者您可以使用。

我也有类似的愿望,做了一些我并不十分自豪的事情,但却完成了工作

def node_checker(node):
    if node.attrib['id'].find('hurf-durf') > -1:
        return True
    else:
        return False


for node in itertools.ifilter(node_checker, r.iterdescendants(tag='sometag')):
    print node.tag
这不是我最好的作品,但它让我非常接近getElementById,并且具有一定的灵活性,我可以继续解决另一个问题。

您可以使用它来查找您建议的注释:

comments = doc.xpath('.//div[starts-with(@id, "comment-")]')
但是,对于更复杂的匹配,可以使用正则表达式:对于lxml,XPath支持EXSLT命名空间中的正则表达式。见官方文件

下面是一个演示:

from lxml import etree

content = """\
<body>
<div id="comment-1">
  TEXT
</div>

<div id="comment-2">
  TEXT
</div>

<div id="comment-3">
  TEXT
</div>

<div id="note-4">
  not matched
</div>
</body>
"""

doc = etree.XML(content)

# You must give the namespace to use EXSLT RegEx
REGEX_NS = "http://exslt.org/regular-expressions"

comments = doc.xpath(r'.//div[re:test(@id, "^comment-\d+$")]',
                          namespaces={'re': REGEX_NS})
你会得到:

---
<div id="comment-1">
      TEXT
    </div>


---
<div id="comment-2">
      TEXT
    </div>


---
<div id="comment-3">
      TEXT
    </div>
---
正文
---
正文
---
正文
try
html.findall(.//div[以(@id,'comment-')开头)
for comment in comments:
    print("---")
    etree.dump(comment)
---
<div id="comment-1">
      TEXT
    </div>


---
<div id="comment-2">
      TEXT
    </div>


---
<div id="comment-3">
      TEXT
    </div>