【问题标题】:Can't parse a website link from a webpage无法解析网页中的网站链接
【发布时间】:2019-03-21 09:03:29
【问题描述】:

我用 selenium 在 python 中创建了一个脚本来抓取位于网站中Contact details 内的网站地址。但是,问题是没有与该链接关联的 url(不过我可以点击该链接)。

如何解析位于Contact details 内的网站链接?

from selenium import webdriver

URL = 'https://www.truelocal.com.au/business/vitfit/sydney'

def get_website_link(driver,link):
    driver.get(link)
    website = driver.find_element_by_css_selector("[ng-class*='getHaveSecondaryWebsites'] > span").text
    print(website)

if __name__ == '__main__':
    driver = webdriver.Chrome()
    try:
        get_website_link(driver,URL)
    finally:
        driver.quit()

当我运行脚本时,我会看到与该链接相关联的可见文本Visit website

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    带有“访问网站”文本的元素是 span,它具有 vm.openLink(vm.getReadableUrl(vm.getPrimaryWebsite()),'_blank') javascript 而不是实际的 href。 我的建议,如果您的目标是抓取而不是测试,您可以使用下面的解决方案和 requests 包来获取 json 格式的数据并提取您需要的任何信息。
    另一个实际上是点击,就像你做的那样。

    import requests
    import re
    
    headers = {
        'Referer': 'https://www.truelocal.com.au/business/vitfit/sydney',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/73.0.3683.75 Safari/537.36',
        'DNT': '1',
    }
    response = requests.get('https://www.truelocal.com.au/www-js/configuration.constant.js?v=1552032205066',
                            headers=headers)
    assert response.ok
    
    # extract token from response text
    token = re.search("token:\\s'(.*)'", response.text)[1]
    
    headers['Accept'] = 'application/json, text/plain, */*'
    headers['Origin'] = 'https://www.truelocal.com.au'
    
    response = requests.get(f'https://api.truelocal.com.au/rest/listings/vitfit/sydney?&passToken={token}', headers=headers)
    assert response.ok
    # use response.text to get full json as text and see what information can be extracted.
    
    contact = response.json()["data"]["listing"][0]["contacts"]["contact"]
    website = list(filter(lambda x: x["type"] == "website", contact))[0]["value"]
    print(website)
    
    print("the end")
    

    【讨论】:

    • 如果我一开始就知道@Sers,这肯定是我想坚持的方法。您能帮我了解一下您是如何挖掘该链接的吗?
    • 您可以找到有关请求here 的良好信息。随意接受答案,如果它解决了您的问题,stackoverflow.com/help/someone-answers
    • 是的,我知道规则,我一定会接受你的解决方案。我想知道您是如何找到您使用的网址的。我尝试使用 chrome dev 收费,但似乎没有找到。你能帮我解决这个问题吗?谢谢。
    • @MITHU 要找到打开的开发工具,请转到网络选项卡,重新加载页面,然后您可以看到所有文件下载。找到一个您需要的响应,从 Headers 部分获取 headers 和 params。
    猜你喜欢
    • 2017-11-19
    • 2020-03-02
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多