如何使用python

时间:2017-09-04 23:44:37

标签: python web-scraping beautifulsoup python-3.4 urllib

大家好我有这个项目正在使用python 3.4我想抓住livescore.com获取足球比分(结果),例如获得当天的所有分数(英格兰2-2挪威,法国2-1意大利)等我用python 3.4,windows 10 64bit os构建它

我尝试了两种方法:

import bs4 as bs
import urllib.request

sauce = urllib.request.urlopen('http://www.livescore.com/').read()
soup = bs.BeautifulSoup(sauce,'lxml')

for div in soup.find_all('div', class_='container'):
    print(div.text)

当我运行此代码时,一个盒子小狗说: (IDLE的子进程没有建立连接.IDLE无法启动子进程或防火墙软件阻止连接。)

我决定写另一个,这是代码:

# Import Modules
import urllib.request
import re

# Downloading Live Score XML Code From Website and reading also
xml_data = urllib.request.urlopen('http://static.cricinfo.com/rss/livescores.xml').read()

# Pattern For Searching Score and link
pattern = "<item>(.*?)</item>"

# Finding Matches
for i in re.findall(pattern, xml_data, re.DOTALL):
    result = re.split('<.+?>',i)
    print (result[1], result[3]) # Print Score

我收到此错误:     Traceback(最近一次调用最后一次):       文件“C:\ Users \ Bright \ Desktop \ live_score.py”,第12行,中        对于re.findall中的i(pattern,xml_data,re.DOTALL):       在findall中的文件“C:\ Python34 \ lib \ re.py”,第206行         return _compile(pattern,flags).findall(string)     TypeError:不能在类字节对象上使用字符串模式

请大家帮帮我

I uploaded the screenshot of of the first code and i marked the div tags and were it targets with paint color and the Div tag i am targeting is class=container

这是我运行代码时遇到的错误 the error i got when i run the code by Chad

1 个答案:

答案 0 :(得分:3)

在你的第一个例子中 - 该网站正在通过大量的javascript加载其内容,所以我建议在获取源代码时使用selenium。

您的代码应如下所示:

import bs4 as bs
from selenium import webdriver

url = 'http://www.livescore.com/'
browser = webdriver.Chrome()
browser.get(url)
sauce = browser.page_source
browser.quit()
soup = bs.BeautifulSoup(sauce,'lxml')

for div in soup.find('div', attrs={'data-type': 'container'}).find_all('div'):
    print(div.text)

对于第二个示例,正则表达式引擎返回错误,因为请求中的read()函数给出了字节数据类型,“re”只接受字符串或unicode。所以你只需要玩xpec_data到str。

这是修改后的代码:

for i in re.findall(pattern, str(xml_data), re.DOTALL):
    result = re.split('<.+?>',i)
    print (result[1], result[3]) # Print Score