V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pppguest3962
V2EX  ›  Python

新手请教 BeautifulSoup 为什么爬不到目标数据?

  •  
  •   pppguest3962 · 2018-08-11 22:16:07 +08:00 · 2793 次点击
    这是一个创建于 2296 天前的主题,其中的信息可能已经有所发展或是发生改变。

    买了本书从零开始初步摸门,虽然已经把书看了一轮了,现在才开始了动手的, 书后面是有提到 xml,lxml 的各种方式(也许高手们都倾向这些方式), 但我还是打算先搞通 html.parser 这个初步方式,获取小目标的成功。。。

    随便在网上找了个表格网页,获取其中一个产品的规格。。。

    用的是 firefox 56.0,自带开发者工具。 右键目标元素,在 firefox 查看器里右键,复制,Xpath,

    得到的是: /html/body/table[2]/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[1]/td[2]/table[2]/tbody/tr[11]/td[3]

    我看书上写的目标元素路径是用 > 表示的(书上提到他的浏览器是 chrome )

    尝试用两种表示方式,都 print 不出目标

    是 soup.select()路径的问题?

    #coding=UTF-8
    import requests
    from bs4 import BeautifulSoup
    
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
    }
    url = 'http://www.chinatimber.org/bj/'
    
    page_req = requests.get(url,headers=headers)
    soup = BeautifulSoup(page_req.text,'html.parser')
    
    
    print(soup.select('html > body > table[2] > tbody > tr[2] > td[2] > table > tbody > tr[3] > td > table > tbody > tr[1] > td[2] > table[2] > tbody > tr[1] > td[3]'))
    print(soup.select('/html/body/table[2]/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/table/tbody/tr[1]/td[2]/table[2]/tbody/tr[1]/td[3]'))
    
    9 条回复    2018-08-12 10:29:27 +08:00
    regicide
        1
    regicide  
       2018-08-11 22:28:35 +08:00 via iPhone
    pd.read_html(page_req)[0]
    xupeng970623
        2
    xupeng970623  
       2018-08-11 22:41:03 +08:00 via Android
    删去 tbody 试试
    VVVVVEX
        3
    VVVVVEX  
       2018-08-11 22:59:19 +08:00
    浏览器会自动加 tbody
    但是有些没 tbody 的,lxml 也取不到数据,我很郁闷,也不知道为啥,反正不是正经事儿,就算了
    imn1
        4
    imn1  
       2018-08-11 23:18:21 +08:00
    1.你应该 copy selector,而不是 xpath
    2.这样 print 只会得到一个 object 吧?后面要加 content 或者 text()什么的
    我也没怎么用 bs,你再查查 bs 手册

    我觉得你还是要学一学 css selector 或者 xpath 语法,这个应该先行
    速成可以搜搜 css xpath cheatsheet
    jimmyczm
        5
    jimmyczm  
       2018-08-11 23:21:51 +08:00
    有些 id 或 class 是整个页面唯一的,那么你直接 select 这个标志会快一点
    lanpong
        6
    lanpong  
       2018-08-11 23:34:58 +08:00
    虽然右键获取是一个捷径,但是有时候会选择的不出来。
    还是认真学一下 css 选择器。不过 BeautifulSoup 里面的 find()和 find_all()更加好理解。
    epicnoob
        7
    epicnoob  
       2018-08-12 00:26:28 +08:00
    不要用 html parse,我碰到过问题,换成 html5lib 就好了
    Sylv
        8
    Sylv  
       2018-08-12 03:29:51 +08:00 via iPhone
    BeautifulSoup 不支持 xpath,soup.select 得用 css selector。
    shakespaces
        9
    shakespaces  
       2018-08-12 10:29:27 +08:00 via Android
    我都无差别 lxml 的。。。有啥区别吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:02 · PVG 04:02 · LAX 12:02 · JFK 15:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.