使用Requests和lxml处理Xpath并提交Webforms

时间:2016-06-24 21:24:07

标签: xml python-3.x web-scraping python-requests

您好我正在开发一个程序,该程序将向反向电话号码网站提交电话号码,然后按照正确的X路径确定手机是否无线。

元素的xpath是

//*[@id="content"]/fieldset/div/table/tbody/tr[3]/td[2]/strong

到目前为止,我的代码是

def Phone_Checker(number):
    url = 'http://www.reversephonelookup.com/'
    data={'Enter Number': number}
    r = requests.post(url, data=data)
    tree=html.fromstring(r.content)
    Service_type=tree.xpath('//fieldset[@id="content"]/text()')
    print(Service_type)
    if "wireless" in Service_type:
        print(True)
        return True
    else: 
        print(False)
        return False

我只是想知道我输入的xpath是错误的,如果我的代码应该正确提交电话号码我也是一个平庸的程序员,并想知道如何能够按照我的意愿制作这个代码功能。

1 个答案:

答案 0 :(得分:0)

你的方法缺少相当多的必要数据和步骤,当我第一眼看到我看到页面使用了大量的javascript但监控请求我看到你实际上可以使用请求获取它,首先我们需要发布到:

if (waitKey(30) >= 0) { break; } ,包含正确的帖子数据:

open issue

完成后我们需要向 http://www.reversephonelookup.com/results.php 发出请求:

enter image description here

所以把它们放在一起:

http://www.reversephonelookup.com/number/the_number
如果无线是列表中的字符串,

def Phone_Checker(number): head = { "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} url = 'http://www.reversephonelookup.com/results.php' data = {"phone": number, "image.x": "26", "image.y": "37"} with requests.Session() as s: s.post(url, data=data, headers=head) r = s.get("http://www.reversephonelookup.com/number/{}/".format(number),headers=head) tree = html.fromstring(r.content) Service_type = tree.xpath('//*[@id="content"]//fieldset//text()') return "wireless" in Service_type Phone_Checker("2068675309") 将仅返回True。我还调整了你的xpath以获取所有文本。

使用该函数的一种更有用的方法是返回lxml树:

return Service_type and "wireless" in Service_type

然后:

def Phone_Checker(number):
    head = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    url = 'http://www.reversephonelookup.com/results.php'
    data = {"phone": number, "image.x": "26", "image.y": "37"}
    with requests.Session() as s:
        s.post(url, data=data, headers=head)
        r = s.get("http://www.reversephonelookup.com/number/{}/".format(number),headers=head)
    return html.fromstring(r.content)

一个例子:

xml = Phone_Checker(....)

第一个结果是连接类型,如果您只是想要,可以使用:

In [5]: xml = Phone_Checker("8598795756")


In [6]: print(xml.xpath("//fieldset//tr/td[text()='Original Service Type:']/following::strong/text()"))
['Landline', 'Independent Telephone Company', 'Versailles, KY', 'VRSLKYXADS0']