【问题标题】:Parsing a url link for a tag from a list of url links parsed from a saved html file. And saving it all in a csv ouput从保存的 html 文件中解析的 url 链接列表中解析标记的 url 链接。并将其全部保存在 csv 输出中
【发布时间】:2015-01-13 07:57:36
【问题描述】:

如何从第 1 部分顺利过渡到第 2 部分,并将结果保存在第 3 部分中?到目前为止,我无法解析抓取的 url 链接,除非我自己将它插入到第 2 部分中。此外,我无法保存输出结果,因为最后一个 url 链接覆盖了所有其他链接。

import urllib
import mechanize
from bs4 import BeautifulSoup
import os, os.path
import urlparse
import re
import csv

第 1 部分:

path = '/Users/.../Desktop/parsing/1.html'

f = open(path,"r")
if f.mode == 'r':       
    contents = f.read()

soup = BeautifulSoup(content
search = soup.findAll('div',attrs={'class':'mf_oH mf_nobr mf_pRel'})
searchtext = str(search)
soup1 = BeautifulSoup(searchtext)   

for tag in soup1.findAll('a', href = True):
    raw_url = tag['href'][:-7]
    url = urlparse.urlparse(raw_url)
    p = "http"+str(url.path)

第 2 部分:

for i in url:
    url = "A SCRAPED URL LINK FROM ABOVE"

    homepage = urllib.urlopen(url)
    soup = BeautifulSoup(homepage)

    for tag in soup.findAll('a',attrs={'name':'g_my.main.right.gifts.link-send'}):
        searchtext = str(tag['href'])
        original = searchtext
        removed = original.replace("gifts?send=", "")
        print removed

第三部分

i = 0
for i in removed:
    f = open("1.csv", "a+")
    f.write(removed)
    i += 1
    f.close

更新1.根据建议,我仍然得到这个: 回溯(最近一次通话最后): 文件“page.py”,第 31 行,在 主页 = urllib.urlopen(url) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py”,第 87 行,在 urlopen 返回 opener.open(url) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py”,第 180 行,打开 fullurl = unwrap(toBytes(fullurl)) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py”,第 1057 行,展开 url = url.strip() AttributeError:“ParseResult”对象没有属性“strip”

【问题讨论】:

  • 顺便说一下,你自己打开文件就不用检查文件模式了。

标签: python csv beautifulsoup mechanize urlparse


【解决方案1】:

在第 1 部分中,您不断用新 URL 覆盖 url。您应该使用一个列表并将 URL 附加到该列表:

urls = []
for tag in soup1.findAll('a', href = True):
    raw_url = tag['href'][:-7]
    url = urlparse.urlparse(raw_url)
    urls.append(url)
    p = "http"+str(url.path) # don't know what that's for, you're not using it later

然后,在第 2 部分中,您可以直接迭代 urls。同样,removed 不应被每次迭代覆盖。此外,不需要变量 original - 您的搜索文本不会被 replace 操作更改,因为它会返回一个新字符串并保留原​​始字符串:

removed_list = []
for url in urls:
    homepage = urllib.urlopen(url)
    soup = BeautifulSoup(homepage)

    for tag in soup.findAll('a',attrs={'name':'g_my.main.right.gifts.link-send'}):
        searchtext = str(tag['href'])
        removed = searchtext.replace("gifts?send=", "")
        print removed
        removed_list.append(removed)

然后,在第 3 部分中,您不必为输出的每一行打开和关闭文件。事实上,您甚至没有正确关闭它,因为您没有调用 close() 方法。正确的方法是使用with statement:

with open("1.csv", "w") as outfile:
    for item in removed_list:
        outfile.write(item + "\n")

虽然我看不出这是一个 CSV 文件(每行只有一项?)...

【讨论】:

  • url = p。我用“A SCRAPED URL LINK FROM ABOVE”替换了“p”
  • 你是对的。我更喜欢每行一个项目的 csv。
  • 哦,好吧,那它不是真正的逗号分隔文件,是吗?
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2015-06-18
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多