【问题标题】:unable to scrape data due to buggy html code由于错误的 html 代码而无法抓取数据
【发布时间】:2017-04-24 03:09:54
【问题描述】:

我正在尝试获取 html 代码所在的电话号码

<span> <a class="click-to-call-link text-gray-light trackMe" href="javascript:;" objid="1236535" compid="clickToCall_profile_directory_sponsored" phone="(617) 981-6551"">Click to Call </a> </span>

电话号码末尾有两个双引号。这使得使用 lxml 获取数据变得困难。 有没有办法获得这个属性。 当我使用 span 的 xpath 并打印结果时,它会显示 &lt;Element span at 0x3750060&gt;,但是当我将 anchoe 标签添加到 xpath 时,它会引发错误。

【问题讨论】:

  • 所以,您有一个失败的 xpath.... 发布该 xpath 和错误消息!从该示例中,我可以成功执行 xpath /span/a

标签: python web-scraping scrapy lxml


【解决方案1】:

你想要Beautiful Soup:

Beautiful Soup 是一个 Python 库,用于从 HTML 和 XML 文件。它与您最喜欢的解析器一起使用以提供惯用的 导航、搜索和修改解析树的方法。

简而言之,它可以处理格式不正确的 HTML 和 XML,并使其更有用。

【讨论】:

    【解决方案2】:

    使用 Beautiful Soup 和 html.parser 可以解析错误的 html 字符串。

    body = '<span>\n<a class="click-to-call-link text-gray-light trackMe" href="javascript:;" objid="1236535" compid="clickToCall_profile_directory_sponsored" phone="(617) 981-6551" "="">Click to Call\n</a>\n</span>'
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(body, 'html.parser')
    soup.find('a').get('phone')
    

    【讨论】:

    【解决方案3】:

    我可以通过这种方式获取电话号码。

    >>> HTML
    '<span><a class="click-to-call-link text-gray-light trackMe" href="javascript:;" objid="1236535" compid="clickToCall_profile_directory_sponsored" phone="(617) 981-6551" "="">Click to Call</a></span>'
    >>> from lxml import etree
    >>> parser = etree.HTMLParser()
    >>> tree = etree.fromstring(HTML, parser=parser)
    >>> link = tree.xpath('.//a')
    >>> link
    [<Element a at 0x5a15e08>]
    >>> link[0].attrib['phone']
    '(617) 981-6551'
    

    您可以使用此代码从整个页面获取电话号码。唯一棘手的地方是 xpath 并记住 xpath 将返回一个列表。

    >>> import requests
    >>> from lxml import etree
    >>> page = requests.get('https://www.houzz.com/pro/charlesrose/charles-rose-architects-inc').text
    >>> parser = etree.HTMLParser()
    >>> tree = etree.fromstring(page, parser=parser)
    >>> links = tree.xpath('.//a[@class="click-to-call-link text-gray-light trackMe"]')
    >>> links[0].attrib['phone']
    '(617) 981-6551'
    

    【讨论】:

    • 我尝试使用这种方法,仍然无法得到结果。它返回一个空列表。我要获取的网页是houzz.com/pro/charlesrose/charles-rose-architects-inc
    • 看起来我发布了错误的 html 。我现在编辑了它
    • 原始代码仍然适用于更新后的 HTML。我添加了适用于从网络下载的页面的代码。
    • 我只运行了两次。第一次没有结果,第二次成功了。可能您所能做的就是构建您的代码以允许这种不可靠性。
    • 嗯,我运行了大约 20 次,它仍然返回一个空列表
    猜你喜欢
    • 2013-03-29
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多