grey_lemon 发表于 2021-5-10 17:16:33

Python爬虫

网页代码是下面这样的, 要怎么写正则表达式才能提取到250mW?
我这样写 re.compile(r'<td class=" ">(\d*)mW</td>',re.S), 结果是空值

<td class=" ">
                              

                              

                              
                                    250
                              

                                 mW
                            </td>

wp231957 发表于 2021-5-10 17:21:40

\d+不就可以吗

grey_lemon 发表于 2021-5-10 17:35:13

wp231957 发表于 2021-5-10 17:21
\d+不就可以吗

可以麻烦写完整的语句吗? 谢谢!

hrp 发表于 2021-5-10 17:40:14

本帖最后由 hrp 于 2021-5-10 17:41 编辑

空格和换行你没算进去

写个丑陋的代码{:10_245:}
import re

s = """<td class=" ">
                              

                              

                              
                                    250
                              

                                 mW
                            </td>"""

p = re.compile(r'<td class=" ">[\s\n]*(\d*)[\s\n]*mW[\s\n]*</td>',re.S)

r = p.search(s)

print(r.group(1))

grey_lemon 发表于 2021-5-10 17:51:54

hrp 发表于 2021-5-10 17:40
空格和换行你没算进去

写个丑陋的代码

谢谢!

那像这样的 两个相同的标签, 要提取的值也没有特殊的模式, 要怎么写啊
#1

<td class=" ">
                              

                              

                              

                                    

                                    
                                        SURFACE MOUNT
                                    
                              

                              
                            </td>


#2

<td class=" ">
                              

                              

                              

                                    

                                    
                                        SMT
                                    
                              

                              
                            </td>

wp231957 发表于 2021-5-10 19:00:34

grey_lemon 发表于 2021-5-10 17:51
谢谢!

那像这样的 两个相同的标签, 要提取的值也没有特殊的模式, 要怎么写啊


说说你到底要干嘛,一般class没有设置为空的

grey_lemon 发表于 2021-5-10 20:49:27

wp231957 发表于 2021-5-10 19:00
说说你到底要干嘛,一般class没有设置为空的

这里要分别提取SURFACE MOUNT(#1) 和 SMT(#2)

总的目的要爬取这个网站上各个Part Number的参数信息
https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page=

剑廿三 发表于 2021-5-10 21:15:02

用BeautiSoup提取html标签内的内容

龙舞九天 发表于 2021-5-11 05:23:09

{:5_95:}

grey_lemon 发表于 2021-5-11 08:45:59

利用head 伪装之后运行后显示 403 Forbidden, 还有办法爬吗?
谢谢!

def askURL(url):
    head = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
    }
    request = urllib.request.Request(url,headers=head)
    html = ""

grey_lemon 发表于 2021-5-11 08:48:54

grey_lemon 发表于 2021-5-11 08:45
利用head 伪装之后运行后显示 403 Forbidden, 还有办法爬吗?
谢谢!



网站是这个

https://www.digikey.cn/en/products/filter/through-hole-resistors/53

wp231957 发表于 2021-5-11 08:51:01

grey_lemon 发表于 2021-5-10 20:49
这里要分别提取SURFACE MOUNT(#1) 和 SMT(#2)

总的目的要爬取这个网站上各个Part Number的参数信息


import requests
from lxml import etree

url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="

res=requests.get(url)
tree = etree.HTML(res.text)
data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
for x in range (1,len(data)+1):
   col=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td"%x)
   for y in range(8,len(col)+1):
          txt=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td[%d]"%(x,y))
          print(txt.text.strip())

grey_lemon 发表于 2021-5-11 16:59:27

wp231957 发表于 2021-5-11 08:51


谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字来翻页, 是想把所有页码(第1页到第50页)的参数信息都提取出来。
运行之后没有变化。。
#2for y in range(8,len(col)+1): 改为从第一列开始提取for y in range(0,len(col)+1):
运行之后没有变化 。。
#3 能否实现把爬取到的信息列为类似网站显示的有标题栏的excel 的格式
import requests
from lxml import etree

url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="
for i in range(0,3):
   url = url + str(i)

res=requests.get(url)
tree = etree.HTML(res.text)
data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
for x in range (1,len(data)+1):
   col=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td"%x)
   for y in range(0,len(col)+1):
          txt=tree.xpath("//table[@id='j-parametric-table']/tbody/tr[%d]/td[%d]"%(x,y))
          print(txt.text.strip())

grey_lemon 发表于 2021-5-11 17:01:38

wp231957 发表于 2021-5-11 08:51


顺便问下pycharm代码怎么复制能粘贴为你这样的格式。。

wp231957 发表于 2021-5-12 06:53:24

grey_lemon 发表于 2021-5-11 16:59
谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字 ...

没有分析网页源码吗?还是不会呢,头七列和后面的格式不一样,pycharm没用过

grey_lemon 发表于 2021-5-12 08:38:09

wp231957 发表于 2021-5-12 06:53
没有分析网页源码吗?还是不会呢,头七列和后面的格式不一样,pycharm没用过

刚开始学爬虫, 所以很多都是一知半解, 打算从实例深度学习。
谢谢啦

wp231957 发表于 2021-5-12 16:22:11

grey_lemon 发表于 2021-5-11 16:59
谢谢!做了两处修改, 麻烦帮忙增加一些功能

#1 对url 加了个for 循环, 因为网站是可以在最后加数字 ...

给你写了一个txt版本的,xls版本的你要是用 自己研究一下,
import requests,re
from lxml import etree

f=open("record.txt","w",encoding="utf-8")
for page in range(1,51):
   print("...............正在处理第 %d 页数据............"%page)
   url="https://www.findchips.com/parametric/Resistors/Fixed%20Resistors?sort=false&page="+str(page)
   res=requests.get(url)
   tree = etree.HTML(res.text)
   data = tree.xpath("//table[@id='j-parametric-table']/tbody/tr")
   for x in range (1,len(data)+1):
          col=data.xpath("./td")
          try:
               three=col.xpath("./a/div/text()").strip()+""
          except:
               three=""
          try:   
               three+=col.xpath("./span/text()").strip()
          except:
               three=three   
          try:
               five=col.xpath("./a/text()").strip()
          except:
               five=""
          try:         
               seven=col.xpath("./text()").strip()
          except:
               seven=""
          line=three+","+five+","+seven+","
          for y in range(8,len(col)+1):
               line+=re.sub(" +"," ",col.text.strip().replace("\n",""))+","
          f.write(line[:-1]+"\n")
          line=""   
f.close()   
print("ok")      

grey_lemon 发表于 2021-5-13 07:55:57

wp231957 发表于 2021-5-12 16:22
给你写了一个txt版本的,xls版本的你要是用 自己研究一下,

非常感谢! 我自己来研究一下试试

grey_lemon 发表于 2021-5-13 07:57:54

请教一下

我用以下代码结果运行后错误提示
403
Forbidden
是不是被识别出来是爬虫了? 已经用head 伪装过了, 还能用其他办法爬吗?

# -- coding = 'utf-8' --

from bs4 import BeautifulSoup
import re
import urllib.request, urllib.error
import xlwt
import sqlite3


def main():
    baseurl = "https://www.digikey.cn/en/products/filter/through-hole-resistors/53?s=N4IgrCBcoA5QjAGhDOl4AYMF9tA"
    datalist = getData(baseurl)
    savepath = ".\\Digikey.xls"
    #saveData
    askURL("https://www.digikey.cn/en/products/filter/through-hole-resistors/53?s=N4IgrCBcoA5QjAGhDOl4AYMF9tA")

def getData(baseurl):
    datalist = []
    return datalist

def askURL(url):
    head = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51"
    }
    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
      response = urllib.request.urlopen(request)
      html = response.read().decode("utf-8")
      print(html)
    except urllib.error.URLError as e:
      if hasattr(e,"code"):
            print(e.code)
      if hasattr(e,"reason"):
            print(e.reason)
    # return html

def saveData(savepath):
    print("save...")

if __name__ == "__main__":
    main()

wp231957 发表于 2021-5-13 08:18:34

grey_lemon 发表于 2021-5-13 07:57
请教一下

我用以下代码结果运行后错误提示


你这也不是那个网站了,我17楼代码是测试成功的
页: [1] 2
查看完整版本: Python爬虫