0

On using this regular expression in python :

pathstring = '<span class="titletext">(.*)</span>'
pathFinderTitle = re.compile(pathstring)

My output is:

Govt has nothing to do with former CAG official RP Singh:
Sibal</span></a></h2></div><div class="esc-lead-article-source-wrapper">
<table class="al-attribution single-line-height" cellspacing="0" cellpadding="0">
<tbody><tr><td class="al-attribution-cell source-cell">
<span class='al-attribution-source'>Times of India</span></td>
<td class="al-attribution-cell timestamp-cell">
<span class='dash-separator'>&nbsp;- </span>
<span class='al-attribution-timestamp'>&lrm;46 minutes ago&lrm;

The text find should have stopped at first "< /span>".

Please suggest whats wrong here.

4

4 回答 4

2

.*是任意字符的贪婪匹配;它将消耗尽可能多的字符。相反,使用非贪婪版本.*?,如

pathstring = '<span class="titletext">(.*?)</span>'
于 2012-11-23T22:24:38.163 回答
2

我建议使用pyquery而不是对正则表达式发疯……它基于 lxml,使 HTML 解析像使用 jQuery 一样容易。

像这样的东西就是你需要的一切:

doc = PyQuery(html)
doc('span.titletext').text()

你也可以使用beautifulsoup,但结果总是一样的:不要使用正则表达式来解析 HTML,有一些工具可以让你的生活更轻松。

于 2012-11-23T22:28:05.440 回答
1

.*将匹配</span>,所以它会一直持续到最后一个。

最好的答案是:不要用正则表达式解析 html。使用lxml库(或类似的东西)。

from lxml import html

html_string = '<blah>'
tree = html.fromstring(html_string)
titles = tree.xpath("//span[@class='titletext']")
for title in titles:
    print title.text

使用适当的 xml/html 解析器将为您节省大量时间和麻烦。如果您使用自己的解析器,您将不得不处理格式错误的标签、评论和无数其他事情。不要重新发明轮子。

于 2012-11-23T22:28:48.933 回答
0

你也可以很容易地使用BeautifulSoup,它非常适合做这种事情。

#using BeautifulSoup4, install by "pip install BeautifulSoup4"
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
result = soup.find('span', 'titletext')

然后result会在你正在寻找的时候举行<span>with 类。titletext

于 2012-11-24T00:12:13.810 回答