【问题标题】:How to access this item using Beautiful Soup如何使用 Beautiful Soup 访问此项目
【发布时间】:2019-06-07 05:56:00
【问题描述】:

我正在尝试访问

中的元素
<script type="text/javascript">ReportPopper("http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls");<script>

使用beautifulsoup,不幸的是我不确定如何访问 ReportPopper 部分并使用Python 将其分配给变量

对不起,如果这已经回答。 我尝试在 find('ReportPopper') 中添加 ReportPopper 并给我一个 none 元素。

import requests
import io
import os
from bs4 import BeautifulSoup


participation = requests.post(url=report_post_url,data=request_post_report_form,headers=report_post_headers,stream=True)
print(participation)


soup = BeautifulSoup(participation.text, 'html.parser')

for n in soup.find_all('script'):
    javascript = n['ReportPopper']
    print(javascript)

我想得到我的最终结果:

javascript = "http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls"

作为我的输出:

Traceback (most recent call last):
  File "c:\Users\John asd\Documents\GitHub\asd.net\testing.py", line 184, in <module>
    javascript = n['ReportPopper']
  File "C:\Users\John asd\asd\Local\Programs\Python\Python37\lib\site-packages\bs4\element.py", line 1016, in __getitem__
    return self.attrs[key]
KeyError: 'ReportPopper'

【问题讨论】:

  • report_post_url 的值是多少?
  • 请检查您发布的元素是否正确。我的意思是:&lt;script type="text/javascript"&gt;ReportPopper("http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls");&lt;script&gt;

标签: javascript python html web-scraping beautifulsoup


【解决方案1】:

re.compile() 返回一个regular expression object,这意味着 h 是一个正则表达式对象。

正则表达式对象有自己的match 方法,带有可选的 pos 和 endpos 参数:

regex.match(string[, pos[, endpos]])

from bs4 import BeautifulSoup
import  re

html = """<script>ReportPopper("http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls");</script>"""

soup = BeautifulSoup(html, 'lxml')
script = soup.find_all("script")

pattern = re.compile('ReportPopper(.*);')

for i in script:
    strObj = i.text
    match = pattern.search(strObj)
    if match:
        print(strObj.split("ReportPopper(")[1][:-2])

O/P:

"http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls"

【讨论】:

    【解决方案2】:

    对于 bs4 4.7.1,如果响应中存在该字符串,则可以使用 :contains

    from bs4 import BeautifulSoup as bs
    # r = requests.get(url)
    # html - r.content
    html = '<script type="text/javascript">ReportPopper("http://asd.asd.asd/ReportOutput/asd-asd-41cc-asd-asd.xls");<script>'
    soup = bs(html, 'lxml')
    s = soup.select_one('script:contains(ReportPopper)').text
    url = s.split('"')[1]
    print(url)
    

    【讨论】:

    • 欢迎。应该比正则表达式更高效。
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-11-14
    • 2011-10-09
    相关资源
    最近更新 更多