因错误的HTML代码而无法抓取数据

时间:2017-04-24 03:09:55

标签: python web-scraping scrapy lxml

我正在尝试获取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并打印结果时它会显示<Element span at 0x3750060>但是当我向xpath添加anchoe标签时会抛出错误。

3 个答案:

答案 0 :(得分:0)

您想要Beautiful Soup

  

Beautiful Soup是一个用于从HTML和HTML中提取数据的Python库   XML文件。它适用于您最喜欢的解析器,以提供惯用语   导航,搜索和修改解析树的方法。

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

答案 1 :(得分:0)

我能够以这种方式获得电话号码。

>>> 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'

答案 2 :(得分:0)

使用美丽的汤与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')