我正在尝试从字符串中找到一个令牌并将其返回。我在其他字符串上使用此方法,它工作正常,但这似乎没有返回任何结果。不是为了findall而不是为了搜索。
pattern= re.compile(r'<input class="token" value="(.+?)" name="csrftoken_reply">')
matches = pattern.findall(htmlstring)
for match in matches:
print match
每个响应字符串中只有一个值。虽然我没有得到“打印匹配”的结果
我也尝试过使用re.search但是同样的事情发生了,返回了一个NoneType对象......
更多信息:
这是我正在解析的html的一部分:
<form id="threadReplyForm" class="clearfix" method="post" action="/go/messages/private/threadID=0551796">
<input class="csrftoken" type="hidden" value="a7b161b7" name="csrftoken_reply">
<input type="hidden" value="reply" name="action">
<div class="editorWrapper">
<div id="premiumSmiliesNotAllowed" class="warning" style="display: none;">
<div id="editor_13" class="clearfix editor" mode="full">
<ul id="editorToolbar_13" class="editorToolbar clearfix">
<textarea id="messageInput" class="autogrow" cols="20" rows="8" name="message"></textarea>
<div id="previewDiv" class="previewArea" style="display: none;"></div>
</div>
<script>
</div>
<script>
<span class="loadingIndicator right loadingIndicatorMessage">
<p class="clearfix">
</form>
解析它:
pattern= re.compile(r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">')
matches = pattern.findall(str(response.read()))
for match in matches:
print match
尝试将a7b161b7作为输出
答案 0 :(得分:1)
您必须举例说明您要解析的字符串,因为这对我有用。
import re
htmlstring = """
<input class="token" value="foo" name="csrftoken_reply">
"""
pattern= re.compile(r'<input class="token" value="(.+?)" name="csrftoken_reply">')
matches = pattern.findall(htmlstring)
for match in matches:
print match
除此之外,您是否考虑使用专为此类设计的库?在解析html时,正则表达式可能会非常脆弱。 Beautiful Soup似乎是这项工作的热门工具。
更新
你有一个错误的类值,一个额外的空间,你忘了'input type =“hidden”'。这里有些接近,但我仍然不鼓励使用正则表达式:
r'<input class="csrftoken" type="hidden" value="(.+?)" name="csrftoken_reply">'
这也有效(我假设有一个'csrftoken_reply'元素):
r'value="(.+?)" name="csrftoken_reply">'
这些都有助于我获得你想要的价值。
答案 1 :(得分:0)
不是Python人,也不建议使用正则表达式来解析html,但它可能是
可以通过这种方式得到无序的att-val数据。只需加入一些对
需要对标签进行限定。它不一定是全部或任何顺序。
修饰符:扩展的单行字符串,全局 价值捕获组是5美元
修改强>
将(?= (?:".*?"|\'.*?\'|[^>]*?)+
更改为(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*?
,因为此形式的延迟量词将被强制超出标记边界以满足前瞻。新的子表达式处理attr="so< m >e"
嵌入式标记,没有溢出。
<input
(?=\s)
(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) class \s*=\s* ([\'"]) \s* csrftoken \s*\1 )
(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) name \s*=\s* ([\'"]) \s* csrftoken_reply \s*\2 )
(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) type \s*=\s* ([\'"]) \s* hidden \s*\3 )
(?= (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) value \s*=\s* ([\'"]) \s* (.*?) \s*\4 )
\s+ (?:".*?"|\'.*?\'|[^>]*?)+ (?<!/)
>
所有警告都适用,可以隐藏在嵌入式代码中,可以是评论等等 需要额外的正则表达式逻辑。
答案 2 :(得分:0)
很抱歉,2011年使用正则表达式解析HTML是临界疯狂:)为此任务优化的库数量非常大,最好的是上面提到的BeautifulSoup和lxml;我可以理解你不想处理lxml因为它的依赖列表和凌乱的安装,但BeautifulSoup是一个文件,会让你的代码更加健壮。
TL; DR:你正在重新发明轮子。