鱼C论坛

 找回密码
 立即注册
查看: 1666|回复: 5

[已解决]爬虫无法爬取?

[复制链接]
发表于 2023-7-19 10:52:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 歌者文明清理员 于 2023-7-19 10:57 编辑

那个网页的代码:
<div class="leading-relaxed break-words"><div class="markdown-body"><p>当然,我可以为您提供一些示例代码。以下是一个简单的Python代码,用于计算两个数字的和:</p>
<pre class="code-block-wrapper"><div class="code-block-header"><span class="code-block-header__lang">python</span><span class="code-block-header__copy">Copy Code</span></div><code class="hljs code-block-body python">num1 = <span class="hljs-built_in">float</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">"请输入第一个数字:"</span>))
num2 = <span class="hljs-built_in">float</span>(<span class="hljs-built_in">input</span>(<span class="hljs-string">"请输入第二个数字:"</span>))

<span class="hljs-built_in">sum</span> = num1 + num2
<span class="hljs-built_in">print</span>(<span class="hljs-string">"两个数字的和为:"</span>, <span class="hljs-built_in">sum</span>)
</code></pre>
<p>这段代码会要求用户输入两个数字,然后计算它们的和并输出结果。</p>
<p>请注意,这只是一个简单的示例代码,可能并不适合所有情况。如果您有具体需求,请告诉我,我会尽力帮助您。</p>
</div></div>

Snipaste_2023-07-19_10-54-22.png

result = re.sub(r'<code class="hljs code-block-body.*?">(.*?)</code>', r"{code}\1{/code}".replace("{", "[").replace("}", "]"), result)

我用的selenium爬取的,完整代码因隐私原因不便泄露

问题是为什么那一行不能用re替换?我的正则有问题吗?
最佳答案
2023-7-19 10:53:21
本帖最后由 isdkz 于 2023-7-19 10:54 编辑

[b]问题出在你的正则表达式中。在Python的正则表达式中, . 字符是匹配除了"\n"以外的任何字符,但在你的HTML代码中, <code> 标签内部有换行符。所以你需要使用 . 字符来匹配包括换行符在内的所有字符,这可以通过在正则表达式前添加 re.DOTALL 标志来实现。

你的正则表达式应该修改为:
result = re.sub(r'<code class="hljs code-block-body.*?">(.*?)</code>', r"[code]\1复制代码", result, flags=re.DOTALL)

这里, re.DOTALL 是一个标志,它改变了 . 的行为,使其匹配包括换行符在内的任何字符。在你的原始代码中, . 不会匹配换行符,所以你的正则表达式无法匹配多行的 <code> 标签内容。

另外,你的替换字符串 r"[code]\1复制代码" 可能有问题,因为它会在代码的末尾添加 复制代码 ,但是你可能想要的是在每个代码块的末尾添加 [/code] 。如果是这样,你应该将替换字符串改为 r"[code]\1[/code]" 。[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-19 10:52:54 | 显示全部楼层
根据您提供的信息,您的代码中使用了re.sub()函数来替换HTML文本中的代码块。然而,您遇到了无法替换的问题,并怀疑是正则表达式出了问题。

根据您提供的代码片段,问题可能出在正则表达式模式上。该模式尝试匹配<code class="hljs code-block-body.*?">(.*?)</code>这样的字符串并进行替换。但是,在HTML文本中查找代码块时,可能存在多个匹配,需要考虑到贪婪匹配问题。

为了解决这个问题,您可以尝试使用非贪婪模式的匹配,即在.*?后加上?。这样,它将只匹配最小的符合条件的文本。修改后的代码如下:
result = re.sub(r'<code class="hljs code-block-body.*?">(.*?)</code>', r"[code]\1复制代码", result)
此外,还要确保您已经正确导入了re模块。如果仍然无法替换,请确保HTML文本中的代码块与正则表达式一致,并且没有其他特殊情况导致替换失败。

希望以上解释对您有所帮助!如果您有任何进一步的问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 10:53:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-7-19 10:54 编辑

[b]问题出在你的正则表达式中。在Python的正则表达式中, . 字符是匹配除了"\n"以外的任何字符,但在你的HTML代码中, <code> 标签内部有换行符。所以你需要使用 . 字符来匹配包括换行符在内的所有字符,这可以通过在正则表达式前添加 re.DOTALL 标志来实现。

你的正则表达式应该修改为:
result = re.sub(r'<code class="hljs code-block-body.*?">(.*?)</code>', r"[code]\1复制代码", result, flags=re.DOTALL)

这里, re.DOTALL 是一个标志,它改变了 . 的行为,使其匹配包括换行符在内的任何字符。在你的原始代码中, . 不会匹配换行符,所以你的正则表达式无法匹配多行的 <code> 标签内容。

另外,你的替换字符串 r"[code]\1复制代码" 可能有问题,因为它会在代码的末尾添加 复制代码 ,但是你可能想要的是在每个代码块的末尾添加 [/code] 。如果是这样,你应该将替换字符串改为 r"[code]\1[/code]" 。[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-7-19 11:00:46 | 显示全部楼层
isdkz 发表于 2023-7-19 10:53
问题出在你的正则表达式中。在Python的正则表达式中, . 字符是匹配除了"\n"以外的任何字符,但在你的HTML ...

你帮助了你的对手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-19 11:02:56 | 显示全部楼层

你也开始着手研究脚本了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-19 11:03:52 | 显示全部楼层
isdkz 发表于 2023-7-19 11:02
你也开始着手研究脚本了?

早就开始了,刚才我修复了最后一个bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表