提问人:h s 提问时间:5/13/2020 更新时间:5/13/2020 访问量:256
如何使用 lxml 清理 HTML 字符串以在 python 中解析它?
How to clean HTML string to parse it in python using lxml?
问:
我有一个 python 字符串,其中包含 HTML 代码,来自我想使用 lxml 库解析的 JSON。该字符串具有多个转义字符和其他特殊字符。如何清理此代码,以便我可以使用 lxml 从中提取信息?我想在字符串上使用 XPATH selectros。
字符串-
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html>\r\n\r\n<head>\r\n <META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n</head>\r\n\r\n<body>\r\n\r\n<div>\r\n <table width=\"640\" align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#ffffff\" style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px\">\r\n <tr>\r\n <td align=\"center\">\r\n\r\n <table align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"max-width:600px;text-align:left\">\r\n <tr>\r\n <td width=\"600\">\r\n <table align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"600\">\r\n <tr>\r\n <td height=\"10\"></td>\r\n </tr>\r\n <tr>\r\n <td align=\"center\">\r\n <a href=\"#0.1_\"><img src=\"https://ns.yatracdn.com/common/images/emailers/corp-flight-hotel/yatra-logo.png\" width=\"101\" height=\"45\" alt=\"Yatra.com\" title=\"Yatra.com\" border=\"0\" style=\"font-family:Arial,Helvetica,sans-serif;font-size:25px;color:#ea2330\" vspace=\"0\" hspace=\"0\" align=\"center\"></a>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td height=\"10\"></td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"600\" style=\"border:1px solid #d8d8d8\">\r\n <tr>\r\n <td height=\"10\"></td>\r\n </tr>\r\n <tr>\r\n <td width=\"10\"></td>\r\n <td colspan=\"3\"><b>Travel Request Details</b></td>\r\n </tr>\r\n <tr>\r\n <td height=\"10\"></td>\r\n </tr>\r\n <tr>\r\n <td width=\"10\"></td>\r\n <td>\r\n <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#ffffff\" style=\"border:1px solid #d8d8d8\">\r\n <tbody>\r\n <tr>\r\n <td width=\"10\"></td>\r\n <td>\r\n <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#ffffff\">\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Email Verification Date / Time </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">12 May 2020 17:14</td>\r\n </tr id='aaaaa'>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Request Submission Date / Time </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">12 May 2020 17:14</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Product </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">Flight</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Journey Type </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">One way</td>\r\n </tr>\r\n\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Adult </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">1</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Child </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">0</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Infant </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">0</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Flight Class </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">Travel Class</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Preferred Airline </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">\r\n </td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Non Stop Flight </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">Preferred Airline</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Traveller Email </td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">[email protected]</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Traveller Mobile</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">9971255462</td>\r\n </tr>\r\n <tr>\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">\r\n Travel Policy Email</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">[email protected]</td>\r\n </tr>\r\n\r\n <tr >\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">Origin</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">New Delhi(DEL)</td>\r\n </tr>\r\n\r\n <tr >\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">Destination</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">Mumbai(BOM)</td>\r\n </tr>\r\n\r\n <tr >\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">Depart Date</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">26 Jun 2020</td>\r\n </tr>\r\n\r\n <tr >\r\n <td height=\"35\" valign=\"middle\" align=\"left\" style=\"border-bottom:1px solid #d8d8d8\">Preferred Time From</td>\r\n <td colspan=\"2\" align=\"right\" style=\"border-bottom:1px solid #d8d8d8\">00:23</td>\r\n </tr>\r\n\r\n </table>\r\n </td>\r\n <td width=\"10\"></td>\r\n </tr>\r\n\r\n </tbody>\r\n </table>\r\n\r\n </td>\r\n <td width=\"10\"></td>\r\n </tr>\r\n\r\n <tr>\r\n <td height=\"10\"></td>\r\n </tr>\r\n </table>\r\n\r\n </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </tr>\r\n </table>\r\n </td>\r\n </tr>\r\n </table>\r\n\r\n</div>\r\n\r\n</body>\r\n\r\n</html>
使用干净的字符串,解析器的工作方式如下:
>>> broken_html = "<html><head><title>test<body><h1>page title</h3>"
>>> parser = etree.HTMLParser()
>>> tree = etree.parse(StringIO(broken_html), parser)
>>> result = etree.tostring(tree.getroot(),
... pretty_print=True, method="html")
>>> print(result)
<html>
<head>
<title>test</title>
</head>
<body>
<h1>page title</h1>
</body>
</html>
答:
1赞
Moe
5/13/2020
#1
也许你想使用BeautifulSoup?它是一个框架,用于构建代码,以便您可以对其进行迭代。您还可以搜索特定的标签、类等。 它的解析器选项之一是 lxml。
from bs4 import BeautifulSoup
soup = BeautifulSoup(broken_html, 'lxml')
soup.titel # returns <title>Titel</title>
soup.find_all('div') # returns an array with all div tags
my_tag = soup.find(id="yourID")
my_tag.find_all('div') # returns you every div tag in the tag with the id yourID
评论
0赞
Moe
5/13/2020
我在帖子中添加了一些示例。
0赞
h s
5/13/2020
我们可以在其中使用Xpath吗?或者你能告诉我如何选择嵌套元素吗?
0赞
h s
5/13/2020
这是我想从我的 html 中选择的 xpath- “//tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr” 它将从 html 返回一个表。从该表中,我想遍历所有 <tr> 元素。
0赞
h s
5/13/2020
好的,我发现我解决了提取我想要的信息的方法。感谢您的帮助。
0赞
M. Hardy
5/13/2020
#2
看起来你需要先解开你的字符串,所以看看ChristopheD的答案。
html_unescaped_string = html_escaped_string.decode('string_escape')
然后,您确实可以使用BeautifulSoup并交叉手指,它会在字符串的其他畸形部分中找到它的方式。
评论