网页抓取:抓取表格中的网址

时间:2021-07-01 15:01:03

标签: python web-scraping beautifulsoup

我正在尝试抓取以下网站:(请注意它是韩语) https://law.go.kr/lsSc.do?menuId=1&subMenuId=15&tabMenuId=81&query=

我需要抓取索引列旁边的“법령명”列中每个链接的所有内容(请参阅下图以供参考),但这些链接似乎不是唯一的。它们似乎都有 https://law.go.kr/lsSc.do?menuId=1&subMenuId=15&tabMenuId=81&query=#undefined 的 url,但该 url 似乎也不适用于创建汤。

我想知道这里可能有什么问题,或者根本不可能抓取这些。

website_screenshot

part_needs_scraping

2 个答案:

答案 0 :(得分:0)

看来,网站在这些行上使用了 onClick 方法。所以唯一的方法是使用 Selenium,因为 requests 和 beautiful soup 无法评估 javascript 函数。

答案 1 :(得分:0)

数据是用Javascript加载的,所以BeautifulSoup看不到它。但是,您可以使用 requests 模块模拟 Ajax 请求。例如:

import re
import requests
from bs4 import BeautifulSoup

url = "https://law.go.kr/lsSc.do?menuId=1&subMenuId=15&tabMenuId=81&query="

menu_url = "https://law.go.kr/lsScListR.do?" + url.split("?")[-1]
content_url = "https://law.go.kr/lsInfoR.do"

data = {
    "q": "*",
    "outmax": "50",
    "p18": "0",
    "p19": "1,3",
    "pg": "1",
    "fsort": "10,41,21,31",
    "lsType": "null",
    "section": "lawNm",
    "lsiSeq": "0",
    "p9": "2,4",
}

soup = BeautifulSoup(requests.post(menu_url, data=data).content, "html.parser")

for a in soup.select(".left_list_bx a[onclick]"):
    if "lsViewWideAll" not in a["onclick"]:
        continue

    lsiSeq, efYd, *_ = re.findall(r"\d+", a["onclick"])

    data = {
        "lsiSeq": lsiSeq,
        "efYd": efYd,
        "chrClsCd": "010202",
        "vSct": "*",
        "efGubun": "Y",
        "ancYnChk": "0",
    }

    s = BeautifulSoup(
        requests.post(content_url, data=data).content, "html.parser"
    )
    print(s.get_text(strip=True, separator="\n"))
    print("-" * 80)

打印:

판례
연혁
위임행정규칙
규제
생활법령
10ㆍ27법난 피해자의 명예회복 등에 관한 법률

...and so on.