无法在excel文件中正确编写提取的项目?

时间:2017-07-16 17:20:53

标签: python excel xpath web-scraping lxml

我在python中编写了一些代码来解析网页上的标题和链接。最初,我尝试从左侧栏中解析链接,然后通过跟踪每个链接从每个页面中删除上述文档。我做得很完美。我试图将不同页面中不同链接的文档保存在一个excel文件中。但是,它创建了几个“Sheets”,从我的脚本中的标题变量中提取所需部分作为工作表名称。我面临的问题是 - 保存数据时,只有链接中每个页面的最后一条记录保存在我的Excel工作表而不是完整记录中。这是我尝试过的脚本:

import requests
from lxml import html
from pyexcel_ods3 import save_data

web_link = "http://www.wiseowl.co.uk/videos/"
main_url = "http://www.wiseowl.co.uk"

def get_links(page):

    response = requests.Session().get(page)
    tree = html.fromstring(response.text)
    data = {}
    titles = tree.xpath("//ul[@class='woMenuList']//li[@class='woMenuItem']/a/@href")
    for title in titles:
        if "author" not in title and "year" not in title:
            get_docs(data, main_url + title)

def get_docs(data, url):

    response = requests.Session().get(url)
    tree = html.fromstring(response.text)

    heading = tree.findtext('.//h1[@class="gamma"]')

    for item in tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']"):
        title = item.findtext('.//a')
        link = item.xpath('.//a/@href')[0]
        # print(title, link)
        data.update({heading.split(" ")[-4]: [[(title)]]})
    save_data("mth.ods", data)

if __name__ == '__main__':
    get_links(web_link)

2 个答案:

答案 0 :(得分:2)

更新data dict中的值时,会替换先前的值。

如果您替换此行,则可以解决此问题:

data.update({heading.split(" ")[-4]: [[(title)]]})

有了这个(它有点难看,但它有效):

data[heading.split(" ")[-4]] = data.get(heading.split(" ")[-4], []) + [[(title)]]

答案 1 :(得分:2)

或者如果您希望它更具可读性:

link

修改:要将if sheetname in data: data[sheetname].append([title, str(link)]) else: data[sheetname] = [[title, str(link)]] 插入下一列,您只需将其添加到列表中,如下所示:

save_data

Edit2 要将它们放在同一页面上,您需要将它们附加到同一个键,因为键表示工作表,而值表示sheetname = 'You are welcome' for item in tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']"): title = item.findtext('.//a') if sheetname in data: data[sheetname].append([title]) else: data[sheetname] = [[title]] save_data("mth.ods", data) 中的行和列。像这样:

in