使用美丽的汤获取特定div元素的子元素

时间:2017-01-27 08:19:18

标签: python web-scraping beautifulsoup

我正在尝试从此链接中删除表格数据

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

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

4 个答案:

答案 0 :(得分:0)

enter image description here

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

使用selemium

答案 1 :(得分:0)

我只是想提一下你正在使用的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。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您可以像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())