在 Python 中用 str.split 解析 HTML
Parsing HTML with str.split in Python
我正在用请求模块解析一个网站,我试图在不使用 BeautifulSoup.这是我要解析的部分代码:
<td class="notranslate" style="height:25px;">
<a class="post-list-subject" href="/Forum/ShowPost.aspx?PostID=80631954">
<div class="thread-link-outer-wrapper">
<div class="thread-link-container notranslate">
Forum Rule: Don't Spam in Any Way
</div>
我正在尝试获取标签内的文本:
/Forum/ShowPost.aspx?PostID=80631954
问题是,因为我正在解析一个论坛网站,所以这些分隔标签有多种用途。我想使用 string.split 检索 table 的 post 个 URL,代码类似于:
htmltext.split('<a class="post-list-subject" href="')[1].split('"><div class="thread-link-outer-wrapper">')[0]
HTML 代码中没有任何内容指示页面上的 post 编号,只有链接。
考虑使用 Beautiful Soup。它会让你的生活更轻松。注意解析器的选择,以便您可以获得适合您的任务的速度和宽容度的平衡。
在不建立瓶颈的情况下尝试预优化似乎真的很冒险 html 解析。如果您担心性能,为什么不使用 lxml?模块导入几乎从来不是瓶颈,这听起来像是搬起石头砸自己的脚。
就是说,这在技术上可以满足您的需求,但实际上它并不比在长 运行 中使用像 lxml 这样的 HTML 解析器更高效。明确避免 HTML 解析器也可能会大大增加您的开发时间,因为您会找出晦涩的字符串操作片段,而不是仅仅使用您通过 HTML.
免费获得的漂亮树结构。
strcleaner = lambda x : x.replace('\n', '').replace(' ', '').replace('\t', '')
S = strcleaner(htmltext)
S.split(strcleaner('<a class="post-list-subject" href="'))[1].split(strcleaner('"><div class="thread-link-outer-wrapper">'))[0]
您发布的代码的问题是空格和换行符也是字符。
在我看来,有更好的方法可以做到这一点。即使您不想使用 BeautifulSoup,我也会倾向于使用正则表达式。但是,使用您想要的代码绝对可以完成该任务。这是一种使用列表理解的方法:
results = [chunk.split('">')[0] for chunk in htmltext.split('<a class="post-list-subject" href="')[1:]]
我试图尽可能地根据您的基本代码对其进行建模,但我确实简化了其中一个拆分参数以避免空白问题。
如果正则表达式是公平的游戏,你可以这样做:
import re
target = '<a class="post-list-subject" href="(.*)">'
results = re.findall(target, htmltext)
我正在用请求模块解析一个网站,我试图在不使用 BeautifulSoup.这是我要解析的部分代码:
<td class="notranslate" style="height:25px;">
<a class="post-list-subject" href="/Forum/ShowPost.aspx?PostID=80631954">
<div class="thread-link-outer-wrapper">
<div class="thread-link-container notranslate">
Forum Rule: Don't Spam in Any Way
</div>
我正在尝试获取标签内的文本:
/Forum/ShowPost.aspx?PostID=80631954
问题是,因为我正在解析一个论坛网站,所以这些分隔标签有多种用途。我想使用 string.split 检索 table 的 post 个 URL,代码类似于:
htmltext.split('<a class="post-list-subject" href="')[1].split('"><div class="thread-link-outer-wrapper">')[0]
HTML 代码中没有任何内容指示页面上的 post 编号,只有链接。
考虑使用 Beautiful Soup。它会让你的生活更轻松。注意解析器的选择,以便您可以获得适合您的任务的速度和宽容度的平衡。
在不建立瓶颈的情况下尝试预优化似乎真的很冒险 html 解析。如果您担心性能,为什么不使用 lxml?模块导入几乎从来不是瓶颈,这听起来像是搬起石头砸自己的脚。
就是说,这在技术上可以满足您的需求,但实际上它并不比在长 运行 中使用像 lxml 这样的 HTML 解析器更高效。明确避免 HTML 解析器也可能会大大增加您的开发时间,因为您会找出晦涩的字符串操作片段,而不是仅仅使用您通过 HTML.
免费获得的漂亮树结构。strcleaner = lambda x : x.replace('\n', '').replace(' ', '').replace('\t', '')
S = strcleaner(htmltext)
S.split(strcleaner('<a class="post-list-subject" href="'))[1].split(strcleaner('"><div class="thread-link-outer-wrapper">'))[0]
您发布的代码的问题是空格和换行符也是字符。
在我看来,有更好的方法可以做到这一点。即使您不想使用 BeautifulSoup,我也会倾向于使用正则表达式。但是,使用您想要的代码绝对可以完成该任务。这是一种使用列表理解的方法:
results = [chunk.split('">')[0] for chunk in htmltext.split('<a class="post-list-subject" href="')[1:]]
我试图尽可能地根据您的基本代码对其进行建模,但我确实简化了其中一个拆分参数以避免空白问题。
如果正则表达式是公平的游戏,你可以这样做:
import re
target = '<a class="post-list-subject" href="(.*)">'
results = re.findall(target, htmltext)