鱼C论坛

 找回密码
 立即注册
查看: 1900|回复: 8

[已解决]爬虫爬取网页结构不规律的情况

[复制链接]
发表于 2021-8-28 10:17:27 | 显示全部楼层 |阅读模式

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

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

x
当网页结构是这样子的
<tr class="tr_2">
<td><div>...2020-2-5</div></td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td><div>...2020-2-4</div></td>
<td>...</td>
<td>...</td>
</tr>
<tr class="tr_2">
<td><div>...2020-2-3</div></td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td><div>...2020-2-2</div></td>
<td>...</td>
<td>...</td>
</tr>
怎么爬取内容不遗漏呢
我是这么写的
        daily = html.xpath('//tr[contains(@class,"tr_2")]/td[1]/div/text()')
        print(daily)   
但是只能爬取到<tr class="tr_2">内的内容,相当于爬取一个跳一个了,求助各位大佬
最佳答案
2021-8-29 23:28:14
937135952 发表于 2021-8-29 22:52
会了,只要不带[contains(@class,"tr_2")],就能匹配到所有的了

最常用的就是 //tr  这样的呀,匹配所有叫 tr 的标签(节点)。

方括号[...]是起到 进一步过滤的作用……

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-28 19:58:32 | 显示全部楼层
代码发全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 09:00:49 | 显示全部楼层

[code]
def open_url(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language':'en-US,en;q=0.5',
    'Accept-Encoding':'gzip',
    'DNT':'1',
    'Connection':'close'
    }
   
    res =requests.get(url,headers=headers)
    return res  

def find_data(res):
    daily_list = []
   
    all_page = int(53)
    page=int(1)
    while page <all_page :
        
        res.encoding = 'gbk'
        html = etree.HTML(res.text)
        daily = html.xpath('//tr[contains(@class,"tr_2")]/td[1]/div/text()')
        print(daily)   


def main():
    url = "https://vip.stock.finance.sina.com.cn/q/view/vFutures_History.php?jys=dce&pz=JM&hy=JM0&breed=JM0&type=inner&start=2016-01-1&end=2021-08-26"
    res = open_url(url)
    daily_list= find_data(res)

if __name__ =='__main__':
    main()            

      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-29 14:49:39 | 显示全部楼层
937135952 发表于 2021-8-29 09:00
[code]
def open_url(url):
    headers = {

地址固定,又是简单的表格数据,你直接右键copy一两个表格的单元格的 Xpath 就发现规律了。。
比如:
2021-08-26 对应:/html/body/div[1]/div[5]/div[2]/div[2]/table[1]/tbody/tr[2]/td[1]/div
2536.500    对应:/html/body/div[1]/div[5]/div[2]/div[2]/table[1]/tbody/tr[2]/td[2]/div

看出来了吧。。

自己琢磨吧,这还是比较简单的.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 16:38:19 | 显示全部楼层
阿奇_o 发表于 2021-8-29 14:49
地址固定,又是简单的表格数据,你直接右键copy一两个表格的单元格的 Xpath 就发现规律了。。
比如:
2 ...

你说的这个我会啊,你没看清楚我的问题,我的问题是怎么把class="tr_2"的tr和没有class的tr加在一起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-29 19:34:55 | 显示全部楼层
937135952 发表于 2021-8-29 16:38
你说的这个我会啊,你没看清楚我的问题,我的问题是怎么把class="tr_2"的tr和没有class的tr加在一起


标签tr 的class属性 可不止"tr_2",还有 "tdr",若要写应该是 '//tr*[@class="tr_2" or @class="tdr"]'
还有没带的,我是不知道怎么写了,哈哈,反正不能一步到位。

所以我试了好几种xpath(本来不熟,算做练习), 直接找出全部的 tr节点(这种最直接),
它的xpath就是 '//tr',找到的就包括全部的数据,但也包括空的列表。

然后再遍历它里面的元素,for row in trElems:  r=row.xpath('./td/div') 这就确定到每行数据元素了。
但注意表头的六个是[],所以要判断一下过滤,只取表格部分的每行数据,即 r[0].text

这样说,应该明白了了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 22:38:01 | 显示全部楼层
阿奇_o 发表于 2021-8-29 19:34
标签tr 的class属性 可不止"tr_2",还有 "tdr",若要写应该是 '//tr*[@class="tr_2" or @class="tdr"]' ...

可以,我明天试试。
我也想知道没带class的光秃秃的<tr>要怎么写,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 22:52:29 | 显示全部楼层
阿奇_o 发表于 2021-8-29 19:34
标签tr 的class属性 可不止"tr_2",还有 "tdr",若要写应该是 '//tr*[@class="tr_2" or @class="tdr"]' ...

会了,只要不带[contains(@class,"tr_2")],就能匹配到所有的<tr>了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-29 23:28:14 | 显示全部楼层    本楼为最佳答案   
937135952 发表于 2021-8-29 22:52
会了,只要不带[contains(@class,"tr_2")],就能匹配到所有的了

最常用的就是 //tr  这样的呀,匹配所有叫 tr 的标签(节点)。

方括号[...]是起到 进一步过滤的作用……

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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