使用beautifulsoup4的CSS选择无效

3 投票
1 回答
2236 浏览
提问于 2025-04-17 23:36

我试过使用bs4这个库,但它的select方法不管用。

我的代码哪里出问题了呢?

import requests
import bs4

def main():
    r = requests.get("http://nodejs.org/download/")
    soup = bs4.BeautifulSoup(r.text)

    selector = "div.interior:nth-child(2) > table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(3) > a:nth-child(1)"
    print(soup.select(selector)[0].text)

if __name__ == "__main__":
    main()

1 个回答

3

这个页面上的答案在浏览器中查看和用bs解析时是不同的。你可以看看你的r.text,然后从那里进行解析。

返回的内容大概是这样的:

<div class="interior row">
<div id="installers">
<ul>
<li>
<a href="http://nodejs.org/dist/v0.10.26/node-v0.10.26-x86.msi">
<img alt="" height="50" src="http://nodejs.org/images/platform-icon-win.png" width="45">
              Windows Installer
              <small>node-v0.10.26-x86.msi</small>
</img></a>
</li>
<li>
<a href="http://nodejs.org/dist/v0.10.26/node-v0.10.26.pkg">
<img alt="" height="50" src="http://nodejs.org/images/platform-icon-osx.png" width="45">
              Macintosh Installer
              <small>node-v0.10.26.pkg</small>

所以这里没有表格。希望这能帮到你。

编辑: 我的代码如下,用来获取这个响应:

def main():
    r = requests.get("http://nodejs.org/download/")
    soup = bs4.BeautifulSoup(r.text)
    # print r.text
    selector = "div.interior"
    print(soup.select(selector)[2])

编辑2: 你可以试试用find,这样会更灵活一些。

soup = bs4.BeautifulSoup(r.text)
print(soup.find("a", text="64-bit"))

编辑3: 这个应该可以工作:

def main():
    r = requests.get("http://nodejs.org/download/", headers={"content-type":"text", "User-   Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5"})
    soup = bs4.BeautifulSoup(r.text)
    print(soup.find("table").tr.td.findNextSibling().a['href'])

撰写回答