我试图用标签刮主表:
<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)
答案 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)
这会输出一个如下所示的大文件:
答案 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。