歌者文明清理员 发表于 2023-7-19 10:52:35

爬虫无法爬取?

本帖最后由 歌者文明清理员 于 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>



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

我用的selenium爬取的,完整代码因隐私原因不便泄露{:10_256:}

问题是为什么那一行不能用re替换?我的正则有问题吗?

陶远航 发表于 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"\1复制代码", result)


此外,还要确保您已经正确导入了re模块。如果仍然无法替换,请确保HTML文本中的代码块与正则表达式一致,并且没有其他特殊情况导致替换失败。

希望以上解释对您有所帮助!如果您有任何进一步的问题,请随时提问。

isdkz 发表于 2023-7-19 10:53:21

本帖最后由 isdkz 于 2023-7-19 10:54 编辑

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

你的正则表达式应该修改为:

result = re.sub(r'<code class="hljs code-block-body.*?">(.*?)</code>', r"\1复制代码", result, flags=re.DOTALL)


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

另外,你的替换字符串 r"de]\1复制代码" 可能有问题,因为它会在代码的末尾添加 复制代码 ,但是你可能想要的是在每个代码块的末尾添加 [/code] 。如果是这样,你应该将替换字符串改为 r"]\1de]" 。

歌者文明清理员 发表于 2023-7-19 11:00:46

isdkz 发表于 2023-7-19 10:53
问题出在你的正则表达式中。在Python的正则表达式中, . 字符是匹配除了"\n"以外的任何字符,但在你的HTML ...

你帮助了你的对手{:10_256:}

isdkz 发表于 2023-7-19 11:02:56

歌者文明清理员 发表于 2023-7-19 11:00
你帮助了你的对手

你也开始着手研究脚本了?{:10_257:}

歌者文明清理员 发表于 2023-7-19 11:03:52

isdkz 发表于 2023-7-19 11:02
你也开始着手研究脚本了?

早就开始了,刚才我修复了最后一个bug{:10_256:}
页: [1]
查看完整版本: 爬虫无法爬取?