鱼C论坛

 找回密码
 立即注册
查看: 3258|回复: 11

Web Scraping代码上的一些疑问

[复制链接]
发表于 2017-7-4 22:10:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jayinsky2005 于 2017-7-4 22:14 编辑

以下的web scraping代码中有一些地方想不到为何要这样编,求解答:
===========================================================
url_list = ['url1', 'url2', 'url3'...]
res=[] #placing res outside of loop -------------问题1: 为何这个要放在loop外头,而且为何下面又有另一个res = [i for i in res if i[0]!='']
for link in url_list:
    r = requests.get(link)
    r.encoding = 'utf-8'

    html_content = r.text
    soup = BeautifulSoup(html_content, 'lxml')


    table = soup.find('table', class_='bigborder')
    if not table:
        continue

    trs = table.find_all('tr')

    if not trs:
        continue #if trs are not found, then starting next iteration with other link
        
    headers = trs[0]
    headers_list=[]
    for td in headers.find_all('td'):
        headers_list.append(td.text)
    headers_list+=['Season']
    headers_list.insert(19,'pseudocol1')
    headers_list.insert(20,'pseudocol2')
    headers_list.insert(21,'pseudocol3')   

    row = []
    season = '' ---------- 问题2: 这个的意义是什麽
    for tr in trs[1:]:
        if 'Season' in tr.text:
            season = tr.text

        else:
            tds = tr.find_all('td')
            for td in tds:
                row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip())
            row.append(season.strip())
            res.append(row)
            row=[]  ------------问题3: 这个跟上面蓝色的row=[]不是又重覆了吗?

res = [i for i in res if i[0]!=''] #outside of loop -----------问题4: 这个我完全看不懂是要干甚麽

df=pd.DataFrame(res, columns=headers_list) #outside of loop
del df['pseudocol1'],df['pseudocol2'],df['pseudocol3']
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-5 11:11:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-5 11:42:06 | 显示全部楼层
res=[]是创建空列表赋值给res
season = ''是创建空str变量赋值给season
条件else中的row = []是想清空列表
res = [i for i in res if i[0]!=''] 是条件循环的一种python风格的缩写,你可以多看看小甲鱼教程了解一下python基础,尤其是列表的知识。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 11:47:06 | 显示全部楼层
这个你认真看一下就知道了吧。
在循环外定义了res是因为循环内有用到res这个变量。

同理row也是一样的。不过从逻辑来看,row其实不用再外部定义。可以直接放个列表推导式。差别也不大。又定义一遍是要初始化。

关于season变量在之前定义,是如果第一次循环就走了else线路那season这个变量是没有定义的。

关于res = [i for i in res if i[0]!=''],从目的来看是为了清除res里每个对象的0号索引处是''的对象。大概是''的值没有意义吧。

关于为什么要这么写代码,要根据目的来看。
如果你看懂了这个程序而不懂这四个地方,除了第四点是个语法糖外,其他的三点你应该都会懂。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-5 17:41:01 | 显示全部楼层
本帖最后由 jayinsky2005 于 2017-7-5 18:58 编辑
wei_Y 发表于 2017-7-5 11:47
这个你认真看一下就知道了吧。
在循环外定义了res是因为循环内有用到res这个变量。


row 在else最後重新定义一次是为了初始化?意思是甚麼?有何意义吗?

res = [i for i in res if i[0]!=''],那是代表只要i的第0个索引是''的话便整个i都不要的意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 19:18:51 | 显示全部楼层
jayinsky2005 发表于 2017-7-5 17:41
row 在else最後重新定义一次是为了初始化?意思是甚麼?有何意义吗?

res = !=''],那是代表只要i的 ...

意思就是清空row,因为之前row已经有添加过数据了。

是这个意思。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-5 19:58:10 | 显示全部楼层
wei_Y 发表于 2017-7-5 19:18
意思就是清空row,因为之前row已经有添加过数据了。

是这个意思。

为甚麽要清空row?不是要row里头的数据吗?
我尝试移除这个row =[ ],然後看看res的分别,发现了有row = [ ]的情况下, res里头是[['A', 'A1', 'A2'], ['B', 'B1', 'B2'], 没有row = [ ]的情况下, res里头变成['A', 'A1', 'A2', 'B', 'B1', 'B2'],背後的原理请问是怎样的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-5 21:30:23 | 显示全部楼层
jayinsky2005 发表于 2017-7-5 19:58
为甚麽要清空row?不是要row里头的数据吗?
我尝试移除这个row =[ ],然後看看res的分别,发现了有row = ...


他这个程序需要的数据是
[['A', 'A1', 'A2'], ['B', 'B1', 'B2']] 这样的,
你问为什么他不能是
['A', 'A1', 'A2', 'B', 'B1', 'B2'] 这样的。
这个就要靠你自己看这程序的目的是什么了。
什么样的目的就需要什么样的数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-5 22:14:25 | 显示全部楼层
wei_Y 发表于 2017-7-5 21:30
他这个程序需要的数据是
[['A', 'A1', 'A2'], ['B', 'B1', 'B2']] 这样的,
你问为什么他不能是

确实[['A', 'A1', 'A2'], ['B', 'B1', 'B2']]才是想要的样子,但我不明白的是为甚麽重覆一次row = [ ] 就能把['A', 'A1', 'A2', 'B', 'B1', 'B2'] 转过来,这个我想了很久都不明白。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-6 12:38:50 | 显示全部楼层
jayinsky2005 发表于 2017-7-5 22:14
确实[['A', 'A1', 'A2'], ['B', 'B1', 'B2']]才是想要的样子,但我不明白的是为甚麽重覆一次row = [ ] 就 ...

从代码来看如果不将row初始化,结果应该是:
[['A', 'A1', 'A2'], ['A', 'A1', 'A2', 'B', 'B1', 'B2']...]

这个我也不知道怎么解释
代码里有添加东西放进row列表里,然后将row列表添加到res列表里。。
  1.            for td in tds:
  2.                 row.append(td.text.strip('\n').strip('\r').strip('\t').strip('"').strip())
  3.             row.append(season.strip())
  4.             res.append(row)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-6 14:19:59 | 显示全部楼层
本帖最后由 jayinsky2005 于 2017-7-6 14:25 编辑

会不会是data自身的问题?附上url_list作叁考

url_list = ['http://www.hkjc.com/english/racing/horse.asp?HorseNo=S217', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=A093', 'http://www.hkjc.com/english/racing/horse.asp?HorseNo=V344']
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-6 16:24:06 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-22 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表