使用python3.5网络爬虫时只显示一个字符

时间:2016-12-01 13:45:07

标签: python

我是python的初学者。我尝试使用python3.5网络爬虫做一些实验。这是我的代码:

import urllib
import urllib.request
import re

for x in range(1):
    page = x+1
    url = "http://www.last.fm/tag/female+vocalists/artists?page="+str(page)
    try:
        data=urllib.request.urlopen(url).read()
        data=data.decode('UTF-8')
        #reg = r'<p class="grid-items-item-main-text">.*?link-block-target">'
        #'(.*?)</a>.*?aux-text">"(.*?)"<span class="stat-name"'
        reg = r'<p class="grid-items-(.*?)-main-text'
        pattern = re.compile(reg, re.S)
        items = pattern.findall(data)
        for item in items:
            #print(item[0],item[1])
            print(item[0])
    except URLError as e:
        print('We failed to reach a server.')
        print('Reason: ', e.reason)

但我很失望地发现只显示了一个字符i。它应该显示item

问题出在哪里?请帮我!谢谢!

我尝试根据问题的答案解决问题。真的行!但我有一个新问题!我修改了代码如下:

import urllib
import urllib.request
import re

for x in range(1):
    page = x+1
    url = "http://www.last.fm/tag/female+vocalists/artists?page="+str(page)
    try:
        data=urllib.request.urlopen(url).read()
        data=data.decode('UTF-8')
        reg = r'class=\"link-block-target\"[\r\n]+.*?>.*?</a>[\r\n]+.*?</p>'
        '[\r\n]+.*?<p class=\"grid-items-item-aux-text\">[\r\n]+.*?'
        '<span class=\"stat-name\">'
        pattern = re.compile(reg, re.S)
        items = pattern.findall(data)
        for item in items:
            print(item)
    except URLError as e:
        print('We failed to reach a server.')
        print('Reason: ', e.reason)

我发现它仍然输入了一些东西,但是没有(.*?) 正则表达式。问题出在哪里?谢谢!

我终于解决了我的问题。它属于错误表示多行字符串。这是新代码:

import urllib
import urllib.request
import re

for x in range(1):
    page = x+1
    url = "http://www.last.fm/tag/female+vocalists/artists?page="+str(page)
    try:
        data=urllib.request.urlopen(url).read()
        data=data.decode('UTF-8')
        reg = (r'class=\"link-block-target\"[\r\n]+.*?>(.*?)</a>[\r\n]+.*?</p>'
        '[\r\n]+.*?<p class=\"grid-items-item-aux-text\">[\r\n]+(.*?)'
        '<span class=\"stat-name\">')
        pattern = re.compile(reg, re.S)
        items = pattern.findall(data)
        for item in items:
            print(item[0],item[1])
    except URLError as e:
        print('We failed to reach a server.')
        print('Reason: ', e.reason)

感谢大家帮我解决问题!

2 个答案:

答案 0 :(得分:0)

您正在打印'item'的第一个元素

for item in items:
    #print(item[0],item[1])
    print(item) # not item[0]

答案 1 :(得分:0)

首先,我认为在你的正则表达式中,你错过了"

的转义

reg = r'<p class=\"grid-items-(.*?)-main-text'

然后,如果你想要打印两个结果,你可以使用print(item[0],item[1])做得很好,但正如我在网页的html代码中看到的那样,如果你只想要实际文本(例如,这首歌的标题你应该在你的正则表达式上多做一些工作,或者使用像BeautifulSoup这样的另一个库你是否会找到更强大,更简单的方法来获得你需要的元素。