木良450 2021-12-25 21:31 采纳率: 75%
浏览 63
已结题

python爬虫,我该怎么获取想要的内容(映射练习)

练习要求:怎么通过映射的方式来获取其中的服务评分以及电话号码,并能够进行完整的结果打印
提问:svg坐标与css坐标是相反数,为什么寻找svg坐标还要进行计算)
问题:
1.无法打印出需要的资料

import re
import requests
from parsel import Selector

url = 'http://www.porters.vip/confusion/food.html'
svg_url = 'http://www.porters.vip/confusion/font/food.svg'
css_url = 'http://www.porters.vip/confusion/css/food.css'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Host': 'www.porters.vip'
}

res = requests.get(url,headers=headers)
svg_text = requests.get(svg_url).text
css_text = requests.get(css_url).text

# 下载文本
# with open('柳州.text','w',encoding='utf-8') as f:
#     f.write(res.content.decode())
# with open('柳州_svg.svg','w',encoding='utf-8') as f:
#     f.write(svg_res.content.decode())
# with open('柳州_css.css','w',encoding='utf-8') as f:
#     f.write(css_res.content.decode())
# 查找所对应的css数据
css_class_name = 'vhkqsc'
pile = '.%s(background: -(\d+)px -(\d+)px;)%css_class_name
pattern = re.compile(pile)      # 先编译
css = css_text.replace('\n','').replace(' ','')
print(css)
coord = pattern.findall(css)
print(coord)  #???

if coord:
    x,y = coord[0]
    x,y = int(x),int(y)
    print(x,y)      #???

# 因为svg有四个text,需要寻找对应css标签
svg_data = Selector(svg_text)

texts = svg_data.xpath("//text")
print(texts)

# 根据y值来确定,css的位置 --》 svg对应的值,取最近的一个值
axiy = [i.attrib.get('y') for i in texts if y<=int(i.attrib.get('y'))][0]
print(axiy)

# 提取对应的y的text
svg_text_ = svg_data.xpath("//span[@y=%s]/text()"%axiy).extract_first
print(svg_text_)        #???

# 提取字体大小
fout_size = re.search('font-size:(\d+)px;',svg_text).group(1)
print(fout_size)        #???

# css对应的坐标/字体大小=svg坐标
position = x//int(fout_size)

number = svg_text_[position]
print(number)       #???

print(x,y) 返回为[]

1.确定url
确定svg与css的url

2.发送请求

3.进行css分析每个映射数字的坐标

4.由css对照svg中的text进行查找,并带入字符大小进行计算svg的坐标

5.使用正则,将svg中对应的值添加进,获取完整的信息,并保存

  • 写回答

1条回答 默认 最新

  • CSDN专家-showbo 2021-12-25 23:17
    关注

    因为题主将css中的空格全部替换掉了,但是正则中还有空格,并且正则分组用(),不是{},而且svg中没有span标签,是text
    改下面就可以了

    img

    import re
    import requests
    from parsel import Selector
    from lxml import etree
    def getCssNumber(css_class_name):
        n=kvCls2Number.get(css_class_name,-1)
        if n!=-1:
            return n
    
        pile = '.%s{background:-(\d+)px-(\d+)px;}'%css_class_name
        pattern = re.compile(pile)      # 先编译
        coord = pattern.findall(css)
        x,y = coord[0]
        x,y = int(x),int(y)
    
        # 根据y值来确定,css的位置 --》 svg对应的值,取最近的一个值
        axiy = [i.attrib.get('y') for i in texts if y<=int(i.attrib.get('y'))][0]
    
        # 提取对应的y的text
        svg_text_ = svg_data.xpath("//text[@y=%s]/text()"%axiy).extract_first()
    
        # 提取字体大小
        fout_size = re.search('font-size:(\d+)px;',svg_text).group(1)
    
        # css对应的坐标/字体大小=svg坐标
        position = x//int(fout_size)
        number = svg_text_[position]
    
        kvCls2Number[css_class_name]=number
        return number
    
    
    
    url = 'http://www.porters.vip/confusion/food.html'
    svg_url = 'http://www.porters.vip/confusion/font/food.svg'
    css_url = 'http://www.porters.vip/confusion/css/food.css'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
        'Host': 'www.porters.vip'
    }
    svg_text = requests.get(svg_url).text
    css_text = requests.get(css_url).text
    
    css = css_text.replace('\n','').replace(' ','')
    svg_data = Selector(svg_text)
    texts = svg_data.xpath("//text")
    
    kvCls2Number={}#用来存储已经获取到的样式对应的数字,不需要每次重复获取
    
    
    res = requests.get(url,headers=headers)
    
    tree=etree.HTML(res.text)
    detail=tree.xpath('//div[@class="col details"]')[0]
    span=detail.xpath('.//span[@class="comment_score"]/span')[-1]
    serviceNumber=(getCssNumber(span.xpath('.//d/@class')[0]))
    serviceNumber+=span.xpath('text()')[-1]
    print('服务:'+serviceNumber)
    
    phoneCls=detail.xpath('.//div[@class="col more"]/d/@class')
    phone=""
    for c in phoneCls:
        if c=="":
            phone+="-"
        else:
            phone+=getCssNumber(c)
    
    
    print('电话:'+phone)
    
     
    
    

    img


    有帮助或启发麻烦点下【采纳该答案】,谢谢~~有其他问题可以继续交流~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月29日
  • 已采纳回答 12月26日
  • 修改了问题 12月26日
  • 创建了问题 12月25日

悬赏问题

  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab