从网站上抓取表格结果为空

时间:2021-03-22 20:05:37

标签: python python-3.x beautifulsoup

我试图用标签刮主表:

<table _ngcontent-jna-c4="" class="rayanDynamicStatement">

来自使用“BeautifulSoup”库的以下网站,但代码返回空 [],而打印汤返回 html 字符串并且请求状态为 200。我发现当我使用浏览器“检查元素”工具时,我可以看到表标签但在“查看页面源代码”中,未显示作为“app-root”标签一部分的表标签。 (您看到 <app-root></app-root> 是空的)。此外,网页组件中没有“json”文件可以从中提取数据。请帮我如何抓取表格数据。

import urllib.request
import pandas as pd
from urllib.parse import unquote
from bs4 import BeautifulSoup
yurl='https://www.codal.ir/Reports/Decision.aspx?LetterSerial=T1hETjlDjOQQQaQQQfaL0Mb7uucg%3D%3D&rt=0&let=6&ct=0&ft=-1&sheetId=0'
req=urllib.request.urlopen(yurl)
print(req.status)
#get response
response = req.read()
html = response.decode("utf-8")
#make html readable
soup = BeautifulSoup(html, features="html")
table_body=soup.find_all("table")
print(table_body)

3 个答案:

答案 0 :(得分:2)

该表位于源 HTML 中,但有点隐藏,然后由 JavaScript 呈现。它位于 <script> 标签之一中。这可以用 bs4 定位,然后用 regex 解析。最后,可以将表数据转储到 json.loads,然后转储到 pandas.csv 文件,但由于我不会任何波斯语,您必须查看它是否是任何用途。

仅从一些价值观来看,我认为是。

哦,这可以不用 selenium

方法如下:

import pandas as pd
import json
import re

import requests
from bs4 import BeautifulSoup

url = "https://www.codal.ir/Reports/Decision.aspx?LetterSerial=T1hETjlDjOQQQaQQQfaL0Mb7uucg%3D%3D&rt=0&let=6&ct=0&ft=-1&sheetId=0"
scripts = BeautifulSoup(
    requests.get(url, verify=False).content,
    "lxml",
).find_all("script", {"type": "text/javascript"})

table_data = json.loads(
    re.search(r"var datasource = ({.*})", scripts[-5].string).group(1),
)

pd.DataFrame(
    table_data["sheets"][0]["tables"][0]["cells"],
).to_csv("huge_table.csv", index=False)

这会输出一个如下所示的大文件:

enter image description here

答案 1 :(得分:0)

可能不是最好的解决方案,但使用无头模式的 webdriver,您可以获得所需的一切:

from bs4 import BeautifulSoup

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

option = Options()
option.add_argument('--headless')
url = 'https://www.codal.ir/Reports/Decision.aspx?LetterSerial=T1hETjlDjOQQQaQQQfaL0Mb7uucg%3D%3D&rt=0&let=6&ct=0&ft=-1&sheetId=0'
driver = webdriver.Chrome(options=option)
driver.get(url)
bs = BeautifulSoup(driver.page_source, 'html.parser')
print(bs.find('table'))
driver.quit()

答案 2 :(得分:-1)

看起来您尝试获取的元素是由某些 JavaScript 代码呈现的。您需要使用 Selenium 之类的东西才能获得完全呈现的 HTML。