我尝试从网页抓取一些数据,有些行就像下面的
<td><a href="some_web_site">Mr. Google</a></td>
<td>12.42%</td>
<td>1360</td>
<td><span style="color: #E3170D">49.12%</span></td>
<td><span style="color: #008000">2.513</span></td>
<td><span style="color: #E3170D">0.945</span></td>
<td>5.074</td>
<td>5.371</td>
<td>8.424</td>
</tr>
当然,每行末尾都有一个\ n。 我尝试将“谷歌先生”这个名称以及数据作为我数据矩阵中的一行。 (还有其他数据来自同一网页的其他行) 似乎很难同时匹配所有这些。我能弄清楚的唯一方法是:
pattern=re.complie(r'>([\w\s]*)</a></td>\n
(?:<td>([\d\.\%]*)</td>\n){2}
(?:.*>([\d\.\%]*)</span></td>\n){3}
(?:<td>([\d\.]*)</td>\n){3}')
不幸的是,它只匹配最后一个,即“谷歌先生”,1360,0.945,8.424,但不是所有数据。我应该多次重复该模式而不是使用{2}或{3}吗? 也许重复可以解决它,但真的很丑。:( 我想知道是否有人可以帮助我摆脱这种模式。
另一个选择是使用不同的简单模式分别获取名称和数据。 问题是网页中还有一些其他单独的数据,因此我不想将这个“名称 - 数据”行与单独的数据混合在一起。我别无选择,只需要一次获取名称和数据,这样我就可以确保获得我想要的正确数据。
谢谢。
答案 0 :(得分:1)
正则表达式正在寻找&gt;之间的任何可见字符(不是空格,而不是换行符)。和&lt;
data = re.findall('>\s*([^<\n\r]+)\s*<', html)
print data
这仅适用于您提供的示例字符串。
答案 1 :(得分:0)
更好地使用xpath:
import requests
import urllib2
from lxml import html
url = 'HTTP'
page = requests.get(url)
tree = html.fromstring(page.text)
a = tree.xpath('//td/a/text()|//td/text()')
b = tree.xpath('//td/span/text()')