由于htmlfile = urllib.request.urlopen(urls [i])中的错误,Crawler无法运行

时间:2013-12-01 02:23:31

标签: python python-3.x

我试图做一个网页抓取工具,用户在其中编写网站.txt,Python代码逐个进入并抓取网址并获取网页标题!

import urllib.request
import re

i=0

regex = "<title>(.+?)</title>"
pattern = re.compile(regex)

txtfl = open('websites.txt')
webpgsinfile = txtfl.readlines()
urls = webpgsinfile

while i< len(urls):
    htmlfile = urllib.request.urlopen(urls[i])
    htmltext = htmlfile.read()
    print(htmltext)
    titles = re.findall(pattern,htmltext)
    print(titles)
    i+=1

但我有这个错误:

Traceback (most recent call last):
  File "C:\Users\Vinicius\Documents\GitHub\python-crawler\scrapper-2-0.py", line 17, in <module>
    titles = re.findall(pattern,htmltext)
  File "C:\Python33\lib\re.py", line 201, in findall
    return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object

1 个答案:

答案 0 :(得分:3)

将下载的HTML解码为unicode文本,或使用b'...'字节正则表达式:

regex = b"<title>(.+?)</title>"

或:

htmltext = htmlfile.read().decode(htmlfile.info().get_param('charset', 'utf8'))

但是,您使用的是正则表达式,并且将HTML与此类表达式匹配会变得太复杂,太快。

使用HTML解析器,Python有几个可供选择。我建议您使用BeautifulSoup,一个受欢迎的第三方库。

BeautifulSoup示例:

from bs4 import BeautifulSoup

response = urllib.request.urlopen(url)
soup = BeautifulSoup(response.read(), from_encoding=response.info().get_param('charset'))
title = soup.find('title').text

由于title标记本身不包含其他标记,因此您可以在此处使用正则表达式,但只要您尝试解析嵌套标记,运行进入非常复杂的问题。