我试图做一个网页抓取工具,用户在其中编写网站.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
答案 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
标记本身不包含其他标记,因此您可以在此处使用正则表达式,但只要您尝试解析嵌套标记,将运行进入非常复杂的问题。