【问题标题】:Handling Xpaths and Submitting Webforms using Requests and lxml使用 Requests 和 lxml 处理 Xpath 和提交 Web 表单
【发布时间】:2016-06-24 21:24:06
【问题描述】:

您好,我目前正在开发一个程序,该程序会将电话号码提交到反向电话号码网站,然后按照正确的 Xpath 来确定电话是否是无线的。

元素的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 是否错误,如果我的代码也应该正确提交电话号码,我是一个平庸的程序员,想知道如何让这个代码按我的意愿运行。

【问题讨论】:

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


    【解决方案1】:

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

    http://www.reversephonelookup.com/results.php,带有正确的帖子数据:

    完成后,我们需要向 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")
    

    return Service_type and "wireless" in Service_type 仅当无线是列表中的字符串时才返回 True。我还调整了您的 xpath 以获取所有文本。

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

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

    第一个结果是连接的类型,如果你只想使用它:

    "//fieldset//tr/td[text()='Original Service Type:']/following::strong[1]/text()"
    

    【讨论】:

    • 非常感谢您的帮助!我发现您的回答非常有帮助,但是,当我使用第二个代码中描述的方法时,它仅在我有 phone_checker(number) 时才有效,但是当我尝试从不同的代码访问模块以遍历它返回的电话号码列表时我的错误是 lxml 没有来自字符串的模块,但我没有收到该错误,否则你知道这个问题的根源可能是什么吗?
    • @AugustCosta,你有没有把你的脚本叫做 lxml.py?
    • @Padriac Cunningham,不,我没有编辑我的帖子,以便更好地让您了解我遇到的新问题
    • @AugustCosta,最好提出一个包含完整详细信息的新问题,您可以链接到此问题以获取上下文。粘贴回溯也比使用图像更好。
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2016-10-24
    相关资源
    最近更新 更多