【问题标题】:Getting the child element of a particular div element using beautiful soup使用漂亮的汤获取特定 div 元素的子元素
【发布时间】:2017-01-27 08:19:18
【问题描述】:

我正在尝试从此链接中抓取表格数据

http://bet.hkjc.com/racing/pages/odds_wp.aspx?date=30-01-2017&venue=ST&raceno=2&lang=en

这是我的代码

from lxml import html
import webbrowser
import re
import xlwt
import requests
import bs4

content = requests.get("http://bet.hkjc.com/racing/pages/odds_wp.aspx?date=30-01-2017&venue=ST&raceno=1&lang=en").text # Get page content
soup = bs4.BeautifulSoup(content, 'lxml') # Parse page content 

table = soup.find('div', {'id': 'detailWPTable'}) # Locate that table tag

rows = table.find_all('tr') # Find all row tags in that table

for row in rows:
    columns = row.find_all('td') # Find all data tags in each column
    print ('\n')
    for column in columns:
        print (column.text.strip(),end=' ') # Output data in each column

它没有给出任何输出。请帮忙!

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    表格由JavaScrip 生成,requests 只会返回如图所示的html 代码。

    使用selemium

    【讨论】:

    • 这是对的,我不知道你为什么附上图片,嗯?
    • 但是当我使用 print(table) 打印数据时,它会返回 div 元素,这意味着我们已经到达了这个 div table 。现在我们只需要获取这个 div 元素的表子元素。我们怎样才能做到这一点?
    • @Ardour Technologies 禁用浏览器中的 JS 并查看页面源代码,这将由 requests 返回。
    【解决方案2】:

    我正在查看您的代码的最后一行:

    print (column.text.strip(),end=' ') # Output data in each column
    

    您确定应该阅读column.text。也许你可以试试column.stringscolumn.get_text()。或者column.stripped_strings 甚至

    【讨论】:

    • 不,这实际上是正确的。我为这个网站的另一个链接写了这一行,它给出了所需的输出。这里的问题是它没有提供任何输出以及我在上面发布的错误。
    【解决方案3】:

    我只是想提一下,您使用的 id 用于包装 div,而不是用于子表元素。

    也许您可以尝试以下方法:

    wrapper = soup.find('div', {'id': 'detailWPTable'})
    table_body = wrapper.table.tbody
    rows = table_body.find_all('tr')
    

    但仔细想想,tr元素也是包裹div的后代,所以find_all应该还是能找到他们的%]

    更新:添加 tbody

    更新:抱歉,我还不能发表评论 :)。你确定你有正确的文件。你有没有检查过标签实际上存在的整个汤?

    我猜所有这些行都可以写成:

    rows = soup.find('div', {'id': 'detailWPTable'}).find('tbody').find_all('tr')
    

    更新:是的,包装 div 是空的。因此,您似乎没有像其他人所说的那样得到 javascript 生成的内容。也许您应该按照他的建议尝试 Selenium?可能还有 PhantomJS。

    【讨论】:

    • 是的,但是您能告诉我如何访问这个表格元素,因为它没有任何自己的 id 吗?
    • 还是不行。给出这个错误 rows = table_body.find_all('tr') # 查找该表中的所有行标签 AttributeError: 'NoneType' object has no attribute 'find_all'
    【解决方案4】:

    您可以像这样使用dryscrape 进行尝试:

    import dryscrape
    from bs4 import BeautifulSoup as BS
    import re
    import xlwt
    
    ses=dryscrape.Session()
    ses.visit("http://bet.hkjc.com/racing/pages/odds_wp.aspx?date=30-01-2017&venue=ST&raceno=1&lang=en")
    soup = BS(ses.body(), 'lxml') # Parse page content 
    
    table = soup.find('div', {'id': 'detailWPTable'}) # Locate that table tag
    
    rows = table.find_all('tr') # Find all row tags in that table
    
    for row in rows:
        columns = row.find_all('td') # Find all data tags in each column
        print ('\n')
        for column in columns:
            print (column.text.strip())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 2022-01-12
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多