请教老司机 findall 匹配多次遇到换行出现问题获取不到

2017-02-13 01:38:05 +08:00
 abcdefghi

html 有段循环列表

<tr>
<td class="xinbz" height="30"><input value="856252" name="xzid" type="checkbox"> <a href="856252" title="域名:medytL.com" target="_blank">aaa.com</a></td>
<td>6</td>
<td align="left" ><font color='#0000ff'>企业</font></td>
<td>
企业</td>
<td align="center" ><a href="/?/130000" target='_blank' title="查看此卖家域名商铺">ID:130000</a></td>
<td align="left" >2017-12-2</td>
<td>111元</td>

<td align="center"><a href="856252" target="_blank" title="进入域名: medytL.com ,购买页面"><img src="xbt.jpg" ></a></td>
</tr>


<tr>
<td class="xinbz" height="30"><input value="856252" name="xzid" type="checkbox"> <a href="856252" title="域名:medytL.com" target="_blank">bbb.com</a></td>
<td>6</td>
<td align="left" ><font color='#0000ff'>企业</font></td>
<td>
企业</td>
<td align="center" ><a href="/?/130000" target='_blank' title="查看此卖家域名商铺">ID:130000</a></td>
<td align="left" >2017-12-2</td>
<td>222元</td>

<td align="center"><a href="856252" target="_blank" title="进入域名: medytL.com ,购买页面"><img src="xbt.jpg" ></a></td>
</tr>

我这段代码只能获取到第一组数据

get_datas = re.findall(r'target="_blank">(.*)<\/a>(.|\n)*<td>(\d+)元</td>', html, re.M);
print get_datas;

[('uuupk.com', '\n', '111')]

我想获取当前页面所有匹配的,类似 [('aaa.com', '\n', '111'),('bbb.com', '\n', '222')]

findall 加了 re.M 还是获取不到多次,代码问题出现在了哪里呢? 先谢谢了

4120 次点击
所在节点    Python
6 条回复
sola97
2017-02-13 02:47:39 +08:00
你这么写是贪婪匹配,中间你得加问号 (.|\n)*?
wddoer
2017-02-13 09:33:27 +08:00
为何不用 beautifulsoup 呢
IanPeverell
2017-02-13 09:41:12 +08:00
1L 正解,因为匹配的时候会有两种选择('aaa.com', '\n', '111'),和('aaa.com', '\n', '222'),因为第一种在贪婪模式下优先级比较低,所以会直接处第二个结果,('bbb.com', '\n', '222')就被忽略掉了
ipwx
2017-02-13 12:48:23 +08:00
把 re.M 改成 re.S

re.M == re.MULTILINE 含义是 ^ 和 $ 匹配每一行的开头结尾,而不是整个字符串开头结尾。
re.S == re.DOTALL 表示 . 能够匹配 \n

1L 和 3L 并非错误,但是不是标准做法。
2L 其实给出了相对更好的答案,解析网页还是上 BeautifulSoup 更好。
ipwx
2017-02-13 12:50:20 +08:00
好吧,审题不清。 1L 和 3L 的 .*? 还是必要的。加上 re.S 你就不用 (.|\n)*? 了。
Allianzcortex
2017-02-13 19:59:26 +08:00
.*+ 后面加一个 ? 表示匹配最少的结果~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/340007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX