wangwang123 发表于 2021-11-3 16:54:33

关于html内容提取问题?

本帖最后由 wangwang123 于 2021-11-3 16:55 编辑

baseurl = 'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/'


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

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

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

      # 涨幅
      stockincrease = re.findall(findincrease, item)
      data.append(stockincrease)
      print(stockincrease)
      print(len(stockincrease))

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

getdata(baseurl)

wp231957 发表于 2021-11-3 17:33:18

我感觉,做爬虫的,用正则并不是狠多
推荐你用lxml的etree

wangwang123 发表于 2021-11-3 18:02:35

wp231957 发表于 2021-11-3 17:33
我感觉,做爬虫的,用正则并不是狠多
推荐你用lxml的etree

有推荐的视频可以看的嘛? 现在 就感觉 找不到一个很系统的爬虫方向的教学视频~

suchocolate 发表于 2021-11-3 18:08:38


import requests
from lxml import etree


def main():
    headers = {'user-agent': 'firefox'}
    pn = int(input('输入想爬取的页数:'))
    result = []# 存结果
    for i in range(1, pn + 1):
      url = f'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{i}'
      r = requests.get(url, headers=headers)
      html = etree.HTML(r.text)
      trs = html.xpath('//tbody/tr')
      for tr in trs:
            data = {
                'id': tr.xpath('./td/text()'),
                'code': tr.xpath('./td/a/text()'),
                'name': tr.xpath('./td/a/text()'),
                'cur_price': tr.xpath('./td/text()'),
                'up_down': tr.xpath('./td/text()')
            }
            result.append(data)
    print(result)


if __name__ == '__main__':
    main()

wangwang123 发表于 2021-11-3 21:56:25

suchocolate 发表于 2021-11-3 18:08


感觉我的问题 都是被你解决的 哈哈 感激

kaohsing 发表于 2021-11-4 10:51:43

正则处理一下
import requests
import re


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


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


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

    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*"
    for i in range(1, pn + 1):
      url = f'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{i}'
      PrintData(reWay(rgeStr, req(url)))


def PrintData(l):
    '''simple show'''
    for i in l:
      print(i)


if __name__ == '__main__':
    main()
页: [1]
查看完整版本: 关于html内容提取问题?