Python 解析时去掉重复项

Python 解析时去掉重复项,python,csv,web-scraping,Python,Csv,Web Scraping,我制作了一个用python编写的解析器,除了出现一些重复项外,它的工作做得非常完美。此外,当我打开csv文件时,我可以看到每个结果都被方括号包围。是否有任何解决方法可以快速消除重复数据和方括号?以下是我尝试过的: import csv import requests from lxml import html def parsingdata(mpg): data = set() outfile=open('RealYP.csv','w',newline='') write

我制作了一个用python编写的解析器,除了出现一些重复项外,它的工作做得非常完美。此外,当我打开csv文件时,我可以看到每个结果都被方括号包围。是否有任何解决方法可以快速消除重复数据和方括号?以下是我尝试过的:

import csv
import requests
from lxml import html
def parsingdata(mpg):
    data = set()
    outfile=open('RealYP.csv','w',newline='')
    writer=csv.writer(outfile)
    writer.writerow(["Name","Address","Phone"])
    pg=1
    while pg<=mpg:
        url="https://www.yellowpages.com/search?search_terms=Coffee%20Shops&geo_location_terms=Los%20Angeles%2C%20CA&page="+str(pg)
        page=requests.get(url)
        tree=html.fromstring(page.text)
        titles = tree.xpath('//div[@class="info"]')
        items = []
        for title in titles:
            comb = []
            Name = title.xpath('.//span[@itemprop="name"]/text()')
            Address = title.xpath('.//span[@itemprop="streetAddress" and @class="street-address"]/text()')
            Phone = title.xpath('.//div[@itemprop="telephone" and @class="phones phone primary"]/text()')
            try:
                comb.append(Name[0])
                comb.append(Address[0])
                comb.append(Phone[0])
            except:
                continue
            items.append(comb)

        pg+=1 
        for item in items:
            writer.writerow(item)
parsingdata(3)
导入csv
导入请求
从lxml导入html
def parsingdata(mpg):
数据=集合()
outfile=open('RealYP.csv','w',换行符='')
writer=csv.writer(输出文件)
writer.writerow([“姓名”、“地址”、“电话])
pg=1

当pg时,您当前正在将列表(项目)写入csv,这就是为什么它位于括号中。要避免这种情况,请使用另一个类似以下内容的for循环:

 for title in titles:
        comb = []
        Name = title.xpath('.//span[@itemprop="name"]/text()')
        Address = title.xpath('.//span[@itemprop="streetAddress" and @class="street-address"]/text()')
        Phone = title.xpath('.//div[@itemprop="telephone" and @class="phones phone primary"]/text()')
        if Name:
            Name = Name[0]
        if Address:
            Address = Address[0]
        if Phone:
            Phone = Phone[0]
        comb.append(Name)
        comb.append(Address)
        comb.append(Phone)
        print comb
        items.append(comb)

pg+=1 
for item in items:
    writer.writerow(item)
parsingdata(3)

这应该将每个项目分别写入csv。事实证明,添加到comb的项目本身就是列表,因此这会提取它们。

当我处理.csv文件时,此脚本会删除DUP。检查这是否适用于您:)


我最近发现的这个刮刀的简明版本是:

import csv
import requests
from lxml import html

url = "https://www.yellowpages.com/search?search_terms=Coffee%20Shops&geo_location_terms=Los%20Angeles%2C%20CA&page={0}"

def parsingdata(link):

    outfile=open('YellowPage.csv','w',newline='')
    writer=csv.writer(outfile)
    writer.writerow(["Name","Address","Phone"])

    for page_link in [link.format(i) for i in range(1, 4)]:
        page = requests.get(page_link).text
        tree = html.fromstring(page)

        for title in tree.xpath('//div[@class="info"]'):
            Name = title.findtext('.//span[@itemprop="name"]')
            Address = title.findtext('.//span[@itemprop="streetAddress"]')
            Phone = title.findtext('.//div[@itemprop="telephone"]')
            print([Name, Address, Phone])
            writer.writerow([Name, Address, Phone])

parsingdata(url)

无需阅读代码:丢弃重复项的规范解决方案是使用一个包含所有可见值的集合。在对下一个值进行任何操作之前,请检查它是否在集合中。谢谢timgeb爵士的回答。我会努力实现你刚才说的,但我是个新手,所以有时候很难坚持。谢谢。亲爱的timgeb爵士,我试着按照你说的做,但这次它产生了不可破坏的类型:“list”错误。请存储一个可哈希类型,对应的元组或字符串。嗨,bjpreisler,谢谢你的回答。我应用了你刚才的建议。它确实清除了方括号,但所有结果都是一列,而不是三列。@SMth80,我编辑了上面的代码,应该可以解决这个问题!谢谢bjpreisler,它完成了任务。顺便说一句,你能建议我如何正确地使用set()来避免这种情况下的重复。你是希望消除名称(“星巴克”)的重复,还是希望整个项目(名称、地址、电话)是重复的?不是这样。当我从csv文件中单击“删除重复项”选项时,它已删除了五页,因此删除了一些重复项。然而,通过查看数据,我可以注意到,它确实在数据中删除了一些具有相同值的项目。星巴克是一个不同的案例,因为你知道它虽然有相同的名字,但它包含的地址和电话号码彼此不同。谢谢
import csv
import requests
from lxml import html

url = "https://www.yellowpages.com/search?search_terms=Coffee%20Shops&geo_location_terms=Los%20Angeles%2C%20CA&page={0}"

def parsingdata(link):

    outfile=open('YellowPage.csv','w',newline='')
    writer=csv.writer(outfile)
    writer.writerow(["Name","Address","Phone"])

    for page_link in [link.format(i) for i in range(1, 4)]:
        page = requests.get(page_link).text
        tree = html.fromstring(page)

        for title in tree.xpath('//div[@class="info"]'):
            Name = title.findtext('.//span[@itemprop="name"]')
            Address = title.findtext('.//span[@itemprop="streetAddress"]')
            Phone = title.findtext('.//div[@itemprop="telephone"]')
            print([Name, Address, Phone])
            writer.writerow([Name, Address, Phone])

parsingdata(url)