鱼C论坛

 找回密码
 立即注册
查看: 1982|回复: 5

[已解决]关于html内容提取问题?

[复制链接]
发表于 2021-11-3 16:54:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wangwang123 于 2021-11-3 16:55 编辑
  1. baseurl = 'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/'


  2. findorder = re.compile(r'<td>(\d*)</td>')
  3. findstockcode = re.compile(r'<a.*target="_blank">(\d{6})</a>')
  4. findincrease = re.compile(r'<tr>.*<td class="c-rise">(.*)</td>.*<tr>',re.S)

  5. # 获取url
  6. def getdata(baseurl):
  7.     for page in range(1, 2):
  8.         url = baseurl + str(page)
  9.         html = gethtml(url)
  10.         print("得到第%d页html"%page, url)
  11.         soup = BeautifulSoup(html, "html.parser")
  12.         data = []
  13.         item = str(soup.find_all("tr"))   # 问题在这,由于要是用re.findall,后面都变成了文本,用正则的时候就很难用, 比如 我想找涨幅数据,要用c_rise 找到位置,可是有4个c_rise.就没法指定到我想要的那个数据,甚至下面都有其他的c_rise,怎么解决呢?或者 可以告诉我怎么去指定特定标签内的标签去查找内容,比如说这个案例里,要在 tr标签里的td标签去查找内容,我的最终目的就是想把涨跌幅数据提取出来,然后和对应的股票代码结合一起。希望大佬可以帮忙解决~谢谢~卡我半天的 实在想不出来了~
  14.         # 序号
  15.         order = re.findall(findorder, item)
  16.         data.append(order)

  17.         # 股票代码
  18.         stockcode = re.findall(findstockcode, item)
  19.         data.append(stockcode)

  20.         # 涨幅
  21.         stockincrease = re.findall(findincrease, item)
  22.         data.append(stockincrease)
  23.         print(stockincrease)
  24.         print(len(stockincrease))

  25. # 获取html
  26. def gethtml(url):
  27.     header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  28.                             'Chrome/94.0.4606.81 Safari/537.36'}
  29.     request = urllib.request.Request(url, headers=header)
  30.     response = urllib.request.urlopen(request)
  31.     html = response.read().decode("GBK")
  32.     return html

  33. getdata(baseurl)
复制代码
最佳答案
2021-11-3 18:08:38

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     headers = {'user-agent': 'firefox'}
  5.     pn = int(input('输入想爬取的页数:'))
  6.     result = []  # 存结果
  7.     for i in range(1, pn + 1):
  8.         url = f'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{i}'
  9.         r = requests.get(url, headers=headers)
  10.         html = etree.HTML(r.text)
  11.         trs = html.xpath('//tbody/tr')
  12.         for tr in trs:
  13.             data = {
  14.                 'id': tr.xpath('./td[1]/text()')[0],
  15.                 'code': tr.xpath('./td[2]/a/text()')[0],
  16.                 'name': tr.xpath('./td[3]/a/text()')[0],
  17.                 'cur_price': tr.xpath('./td[4]/text()')[0],
  18.                 'up_down': tr.xpath('./td[5]/text()')[0]
  19.             }
  20.             result.append(data)
  21.     print(result)


  22. if __name__ == '__main__':
  23.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-3 17:33:18 From FishC Mobile | 显示全部楼层
我感觉,做爬虫的,用正则并不是狠多
推荐你用lxml的etree
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 18:02:35 | 显示全部楼层
wp231957 发表于 2021-11-3 17:33
我感觉,做爬虫的,用正则并不是狠多
推荐你用lxml的etree

有推荐的视频可以看的嘛? 现在 就感觉 找不到一个很系统的爬虫方向的教学视频~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 18:08:38 | 显示全部楼层    本楼为最佳答案   

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     headers = {'user-agent': 'firefox'}
  5.     pn = int(input('输入想爬取的页数:'))
  6.     result = []  # 存结果
  7.     for i in range(1, pn + 1):
  8.         url = f'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{i}'
  9.         r = requests.get(url, headers=headers)
  10.         html = etree.HTML(r.text)
  11.         trs = html.xpath('//tbody/tr')
  12.         for tr in trs:
  13.             data = {
  14.                 'id': tr.xpath('./td[1]/text()')[0],
  15.                 'code': tr.xpath('./td[2]/a/text()')[0],
  16.                 'name': tr.xpath('./td[3]/a/text()')[0],
  17.                 'cur_price': tr.xpath('./td[4]/text()')[0],
  18.                 'up_down': tr.xpath('./td[5]/text()')[0]
  19.             }
  20.             result.append(data)
  21.     print(result)


  22. if __name__ == '__main__':
  23.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 21:56:25 | 显示全部楼层

感觉我的问题 都是被你解决的 哈哈 感激
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-4 10:51:43 | 显示全部楼层
正则处理一下

  1. import requests
  2. import re


  3. def req(url):
  4.     headers = {
  5.         'user-agent': 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
  6.     response = requests.get(url, headers=headers)
  7.     return response.text


  8. def reWay(reg, s):
  9.     m = re.findall(reg, s)
  10.     return list(m)


  11. def main():
  12.     pn = 1  # int(input('输入想爬取的页数:'))

  13.     rgeStr = r"<tr>\s*<td>(\d*)</td>\s*<td.*>(.*?)</a></td>\s*<td.*>(.*?)</a></td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*"
  14.     for i in range(1, pn + 1):
  15.         url = f'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{i}'
  16.         PrintData(reWay(rgeStr, req(url)))


  17. def PrintData(l):
  18.     '''simple show'''
  19.     for i in l:
  20.         print(i)


  21. if __name__ == '__main__':
  22.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-17 07:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表