【问题标题】:How to Parse HTML in Python如何在 Python 中解析 HTML
【发布时间】:2020-04-17 04:48:33
【问题描述】:

我在 python 中使用 requests 来获取一个临时邮箱。我需要从下面的 HTML 代码中解析邮件 ID(它在“结果:”旁边)。我曾尝试使用 python 的 parse 模块,但它没有给出有效的结果,相反,我得到了 None 作为结果。 有没有办法使用左右匹配的字符串从 HTML 中解析?

这是我的代码>

r = s.get('https://www.cs.email/inbox',verify = False)
html = r.text
par = parse('\"result: {\"list\":[{\"mail_id":"{}\",\"mail_from\":\"support@windscribe.com\"', html)
print(par)

HTML 下面

</style>
    <script type="text/javascript">
    gm_init_vars = {
        uid: '',
        usr: '',
        api_token : '6ef0a153476ab4ae2090f02d08f31a3a60dd6a70493cc43b397642e4d4f3a5e5',
        ryo_url: 'https://grr.la/ryo/cs.email/',
        hasFlash: false,
        ZeroSwf: '/flash/ZeroClipboard.swf',             passwordJs: '/js/password.min.js',
        ryoJs: '/js/ryo.js',
        bitcoinJs: '/js/bitcoin.js',
        recaptchaJs: 'https://www.google.com/recaptcha/api/js/recaptcha_ajax.js',
        recaptcha2Js: '//www.google.com/recaptcha/api.js',
        base: '/',
        tab: 'inbox',
        assets: '/',
        lang: 'en',
        ajax_url: 'www.cs.email/ajax.php',
        result: {"list":[{"mail_id":"507627420","mail_from":"support@windscribe.com","mail_subject":"Welcome to Windscribe, confirm your email address","mail_excerpt":"\n\t\n\t\t","mail_timestamp":"1587097890","mail_read":"0","mail_date":"04:31:30","att":"0","mail_size":"7429"}],"count":"1","email":"AvnaZrLDcuvwB@guerrillamailblock.com","alias":"kslqme+f9rnfatt6orhcs06gvgo0","ts":1587097897,"sid_token":"aruhantm0ogdh8hl55n1redm6h","stats":{"sequence_mail":"61,458,632","created_addresses":38163242,"received_emails":"12,682,145,335","total":"12,620,686,703","total_per_hour":"107550"},"auth":{"success":true,"error_codes":[]}},
        email_addr: 'AvnaZrLDcuvwB@guerrillamailblock.com',
        alias: 'kslqme+f9rnfatt6orhcs06gvgo0',
        use_alias: true,
        email_timestamp: 1587097897,
        domain: 'cs.email',
        site: 'elfyy',
        limit: 20,
        display_host: 'cs.email',

【问题讨论】:

  • 正则表达式可能会更好。 re.search('"mail_id":"(\d+)"', html) 为我工作。您可以将其扩展为包含更多前面的字符串,但这也可能有风险。谁知道消息之间可能存在哪些细微差别。
  • 感谢您的快速回复! , 它也对我有用。

标签: python python-3.x


【解决方案1】:

我不知道parse 模块,但我看不出它如何能击败正则表达式。您可以使用 HTML 解析器来查找脚本标记,但在这种情况下,实际上只是对整个 html 文本进行正则表达式搜索似乎是合理的。

您的数据嵌入在一个更大的列表中,但我建议保持正则表达式搜索范围窄。您必须平衡误报 "mail_id":"507627420" 匹配与列表中消息之间更可能的差异。所以,

import re
r = s.get('https://www.cs.email/inbox',verify = False)
match = re.search('"mail_id":"(\d+)"', r.text)
if match:
    mail_id = match.group(1)
    print(mail_id)

【讨论】:

  • 你能帮我处理另一个字母数字的正则表达式并包括特殊字符串吗?像这样:- aluhe3jm/609a4a6ff32f19a0e301085edda91d8c?ts=1587097870
  • @JovMan,在该示例中,就正则表达式而言,唯一的特殊字符是 ?。与该确切字符串匹配的正则表达式是r":- aluhe3jm/609a4a6ff32f19a0e301085edda91d8c\?ts=1587097870"。如果你想把等号后面的东西拉出来,你可以添加(\d+)。括号添加一个捕获组,\d 匹配任何数字,+ 表示尽可能匹配。 r":- aluhe3jm/609a4a6ff32f19a0e301085edda91d8c\?ts=(\d+)"
  • aluhe3jm/609a4a6ff32f19a0e301085edda91d8c?ts=1587097870 我想捕获整个字符串。
  • @JovMan - 第一个例子会让你知道确切的字符串是否在文本中。您实际上不必捕捉它,因为您已经知道它是什么。但如果你愿意,你可以把整个东西放在括号里 ( ) ---- 我们以前称之为牛仔腿,但似乎没有人再明白了 ---
  • 对不起,如果你没有明白这一点,或者我不是这个社区的那首诗!但是字符串 - (aluhe3jm/609a4a6ff32f19a0e301085edda91d8c?ts=1587097870) 是一个可变字符串。它是 URL 的一部分 - (https://windscribe.com/signup/confirmemail/aluhe3jm/609a4a6ff32f19a0e301085edda91d8c?ts=1587097870)。直到confirmemail/ 它是不变的
【解决方案2】:

看起来您需要从 HTML 到结果 JSON 对象的电子邮件 ID。 试试this解析器,它可以帮助你获取基于HTML标签的数据。

这是一个相同的示例代码

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
    print("Encountered a start tag:", tag)

def handle_endtag(self, tag):
    print("Encountered an end tag:", tag)

def handle_data(self, data):
    print("Encountered some data:", data)

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

输出将是

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data: Test
Encountered an end tag: title
Encountered an end tag: head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data: Parse me!
Encountered an end tag: h1
Encountered an end tag: body
Encountered an end tag: html

希望这会对您有所帮助。快乐学习。

【讨论】:

  • 没关系,但它是包含 700 多行的整个 HTML 页面。我认为正则表达式更好。不过感谢您的快速回复!
  • OP 的问题是信息嵌入在脚本中。 html 解析器可以帮助您找到&lt;script&gt; 标记,但您需要其他东西才能在脚本中找到数据。由于无论如何都需要正则表达式,所以从一开始就使用它对我来说似乎是更好的解决方案。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2011-06-21
  • 1970-01-01
  • 2010-10-17
  • 2014-12-17
相关资源
最近更新 更多