python 在单独的列中给出列名和写入值作为表

标签 python web-scraping web-crawler

我的代码

from lxml import html
import requests
import csv
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')


# example site
page = requests.get('http://www.wintergreenfund.com/reports/top-ten/')
tree = html.fromstring(page.text)
#This will create a list of services:

tname = tree.xpath('//*[@id="colLeft"]//table//tr/td[1]/text()')
tvalue = tree.xpath('//table//tr/td[2]/text()')



print tname
print tvalue

print 'Input the csv file'
csvfile = raw_input("> ")

res = tname,tvalue


#Assuming res is a list of lists
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(res)

我在 csv 中的输出

Reynolds American Inc. Consolidated-Tomoka Land Co. British American Tobacco

8.30% 7.50% 7.10% 6.60% 6.40% 5.90% 5.30% 4.80% 4.70% 4.10%

要求的输出与具有列名的网站相同

引用 http://www.wintergreenfund.com/reports/top-ten/

而且 unicode 也不起作用。需要这方面的帮助

我的新代码

from lxml import html
import requests
import csv

page = requests.get('http://www.wintergreenfund.com/reports/top-ten/')
tree = html.fromstring(page.text)

csvrows = []
for rows in tree.xpath('//*[@id="colLeft"]//table//tr'):
    csvrows.append([rows.xpath('./td[1]/text()'),rows.xpath('./td[2]/text()')])
print csvrows
print 'Input the csv file'
csvfile = raw_input("> ")
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerow(['Name','Value']) #substitute as appropriate.
    writer.writerows(csvrows)

我在其中获得了 [' '] 的值(value),并且 [ ] 也是空的

最佳答案

首先,如果你想在每个相应的索引处组合两个列表,你应该使用 zip() ,目前你正在创建一个包含两个列表的元组 - res = tname ,tvalue - 然后将其按原样写入 csv。

此外,其次,您应该首先使用 xpath 获取表中的每一行,然后使用 xpath 从中获取每个必需的 td 元素。而不是像您当前使用的那样使用两个 xpath。

例子-

from lxml import html
import requests
import csv

page = requests.get('http://www.wintergreenfund.com/reports/top-ten/')
tree = html.fromstring(page.text)

csvrows = []
for rows in tree.xpath('//*[@id="colLeft"]//table//tr'):
    row1text = rows.xpath('./td[1]/text()')
    row2text = rows.xpath('./td[2]/text()')
    if row1text and row2text:
        csvrows.append([row1text[0],row2text[0]])
print(csvrows)
print('Input the csv file')
csvfile = input("> ")
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerow(['Name','Value']) #substitute as appropriate.
    writer.writerows(csvrows)

关于python 在单独的列中给出列名和写入值作为表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32451219/

相关文章:

python - 无需导入即可使用 Python 脚本

perl - 使用 www::mechanize 的爬虫

javascript - 使用 PhantomJS 和 pjscrape 来抓取动态生成的网页内容

python - 如何在 python 3 中使用 urllib 请求解决 SSL 握手失败?

screen-scraping - 识别恶意网络爬虫

javascript - 如何检索加载需要使用 PhantomJS 或其他工具单击鼠标的 ajax 数据

javascript - html5mode(true) 是否影响谷歌搜索爬虫

python - 我是否总是需要在 django 中启动新站点 "django-admin"

python - 从具有不同长度的列表生成数据框

python - "raw string regex"究竟是什么,你如何使用它?