鱼C论坛

 找回密码
 立即注册
查看: 2110|回复: 19

[已解决]问题解决了,但又没完全解决

[复制链接]
发表于 2023-7-24 13:40:53 | 显示全部楼层 |阅读模式

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

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

x
我要快疯了。
上次的问题出于正则表达式写的不正确,用了陶远航的代码确实可以成功解决问题
但我换了一个网址就又不行了,re匹配出来的很多,但我想要的就是pdf文件的网址
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    response = requests.get(url)
    html_content = response.text

    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改

    pdf_urls = []
    pattern = r'<a\s.*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "http://sdshiyan.jinan.cn/art/2023/7/14/art_5081_296939.html"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)
最佳答案
2023-7-24 14:00:34
本帖最后由 学习编程中的Ben 于 2023-7-24 14:13 编辑

你只少加了一个headers和需要更改主域名,
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari'
    }
    response = requests.get(url, headers=headers)
    html_content = response.text

    domain = re.match(r'(https://.*?\..*?\..*?/)', url).group()
    pdf_urls = []
    pattern = r'<a\s.*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "https://www.lcez.cn/news/2023-7-21/3595.html"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)

评分

参与人数 1荣誉 +1 收起 理由
学习编程中的Ben + 1 已解决问题,请看下方回答,纯手打,求最佳.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-24 13:40:59 | 显示全部楼层
疑似代码截断,回答不全。请提供完整的问题描述和代码,并确保将完整的问题和代码放入
  和  
标记之间,以便我能够更好地帮助你解决问题。求给个最佳答案,非常感谢

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:41:18 | 显示全部楼层
抱歉听到你的问题还没有完全解决,我会尽力帮助你找到解决方案。

根据你提供的代码和描述,我注意到你遇到了新网址无法匹配到正确PDF文件网址的问题。这可能是由于不同的网页结构或HTML标签之间的差异导致的。为了解决这个问题,你可以尝试以下方法:

1. 检查网页源代码:打开新的网址,查看网页源代码,确认PDF文件是否有类似的HTML标签与之前的网址相匹配。如果有不同的标签或属性,请相应地调整正则表达式的模式。

2. 使用其他库或工具:除了使用re库进行正则表达式匹配,你还可以考虑使用其他库或工具来解析HTML,如BeautifulSoup库。BeautifulSoup提供了更便捷的方式来解析和提取网页中的元素。

下面是一个示例代码,演示了如何使用BeautifulSoup库解析网页并提取PDF文件的链接:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def get_pdf_urls(url):
    response = requests.get(url)
    html_content = response.text
    
    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改
    pdf_urls = []

    soup = BeautifulSoup(html_content, 'html.parser')
    links = soup.find_all('a')

    for link in links:
        href = link.get('href')
        if href.endswith('.pdf'):
            absolute_url = urljoin(domain, href)
            pdf_urls.append(absolute_url)
    
    return pdf_urls

# 指定新的网址进行测试
url = "http://sdshiyan.jinan.cn/art/2023/7/14/art_5081_296939.html"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)

在这个示例中,我们使用了BeautifulSoup库来解析网页,并使用find_all()方法找到所有的链接(<a>标签)。然后通过判断链接的href属性是否以.pdf结尾,将符合条件的链接拼接成完整的URL。

希望这个方法能够解决你的问题。如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:41:51 | 显示全部楼层
学习编程中的Ben 发表于 2023-7-24 13:40
疑似代码截断,回答不全。请提供完整的问题描述和代码,并确保将完整的问题和代码放入    标记之间,以便我 ...

???这啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:41:54 | 显示全部楼层
你的代码看起来是在尝试从指定的网页中抓取所有的PDF文件链接。出现问题的可能原因是PDF链接在HTML内容中的格式有所变化,或者你的正则表达式没有正确匹配新网址中的链接格式。

我们来修改一下你的正则表达式。当前,你正在寻找带有 ".pdf" 的  <a>  标签链接,假设它们的格式如  <a href="file.pdf"> 。然而,在实际的HTML代码中,链接可能会有很多其他属性,例如样式、类、id等,并且这些属性的顺序也可能会变化。

下面是一个改进的版本,这个正则表达式会寻找任何  <a>  标签中的链接,只要链接以 ".pdf" 结尾,而不论其他属性如何出现或排序。
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    response = requests.get(url)
    html_content = response.text

    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改

    pdf_urls = []
    pattern = r'<a[^>]*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "http://sdshiyan.jinan.cn/art/2023/7/14/art_5081_296939.html"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)

我修改的正则表达式为 <a[^>]*?href="(.*?\.pdf)" ,在 <a 和 href 之间的部分使用了 [^>]*? 来匹配可能出现的其他属性。 [^>] 代表匹配任何不是 > 的字符, * 代表前面的字符可以出现任意次, ? 则使得这个匹配是非贪婪的,也就是说尽可能少的匹配字符。

这个正则表达式应该可以更好的应对链接属性的变化。然而请注意,正则表达式并不能处理所有HTML的复杂性。如果你需要处理更复杂的HTML结构,可能需要考虑使用像BeautifulSoup这样的HTML解析库。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-24 13:43:30 | 显示全部楼层
isdkz 发表于 2023-7-24 13:41
你的代码看起来是在尝试从指定的网页中抓取所有的PDF文件链接。出现问题的可能原因是PDF链接在HTML内容中的 ...

返回结果
['http://sdshiyan.jinan.cn/picture/0/25a8fdd9fcf1450ca85ed34926a2ecb7.png" target="_blank"><img title="图片1.png" style="border: none; width: 190.791px; height: 195px;" src="/picture/0/s_25a8fdd9fcf1450ca85ed34926a2ecb7.png" width="190" height="195"/></a><br/> </span></p><p style="margin: 0;text-indent: 37px;padding: 0;line-height: 30px;background: rgb(255, 255, 255);"><strong><span style="font-family: 华文中宋;letter-spacing: 0;font-size: 19px;">三、校区意向填报及材料收取</span></strong></p><p style="margin-top:0;margin-right:0;margin-bottom:0;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><span style="font-family: 黑体;letter-spacing: 0;font-size: 19px;">(一)校区意向填报:</span></p><p style="margin-top:0;margin-right:0;margin-bottom:0;text-indent:37px;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">请</span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">第一批次被山东省实验中学录取的考生或家长</span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">,</span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;"><span style="font-family:仿宋">务必于</span><span style="font-family:仿宋">7</span></span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;"><span style="font-family:仿宋">月</span><span style="font-family:仿宋">1</span></span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">4-15</span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">日</span><span style="font-family: 仿宋;color: rgb(255, 0, 0);letter-spacing: 0;font-size: 19px;">扫描下方二维码</span><span style="font-family: 仿宋;color: rgb(255, 0, 0);letter-spacing: 0;font-size: 19px;">,完成校区意向选择</span><span style="font-family: 仿宋;color: rgb(255, 0, 0);letter-spacing: 0;font-size: 19px;">。</span></p><p style="margin-top:0;margin-right:0;margin-bottom:0;text-indent:37px;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><span style="font-family: 仿宋;color: rgb(255, 0, 0);letter-spacing: 0;font-size: 19px;"><br/></span></p><p style="text-align:center;margin-top:0;margin-right:0;margin-bottom:0;text-indent:32px;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><a href="/picture/0/c03a688810b04f5594a1aa43719d0bf4.png" target="_blank"><img title="图片2.png" style="border: none; width: 185.916px; height: 185px;" src="/picture/0/s_c03a688810b04f5594a1aa43719d0bf4.png" width="185" height="185"/></a><br/><span style="font-family:Calibri;font-size:16px;"> </span></p><p style="margin-top:0;margin-right:0;margin-bottom:0;text-indent:37px;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><span style="font-family: 黑体;letter-spacing: 0;font-size: 19px;">(二)</span><span style="font-family: 黑体;letter-spacing: 0;font-size: 19px;">寄宿校区资料提交</span></p><p style="margin-top:0;margin-right:0;margin-bottom:0;text-indent:37px;padding:0 0 0 0 ;text-autospace:ideograph-numeric;line-height:30px;background:rgb(255,255,255);"><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">填报寄宿校区的学生</span><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;">需要提交相关证明材料</span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><strong><span style="font-family: 仿宋_GB2312;font-size: 18px;">时间:</span></strong><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;background: rgb(255, 255, 255);"><span style="font-family:仿宋">7月20-22日,每天上午8:30—11:30,下午2:00—5:00</span></span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><strong><span style="font-family: 仿宋_GB2312;font-size: 18px;">地点:</span></strong><span style="font-family: 仿宋;letter-spacing: 0;font-size: 19px;background: rgb(255, 255, 255);"><span style="font-family:仿宋">山东省实验中学中心校区(经七路</span><span style="font-family:仿宋">73号)。</span></span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><strong><span style="font-family: 仿宋_GB2312;font-size: 18px;">要求:</span></strong></p><p style="font-size:14px;text-indent: 36px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;">1.</span><span style="font-family: 仿宋_GB2312;font-size: 18px;">证明材料需和校区意向网报系统中所填现居住详细地址吻合。</span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;">2.</span><span style="font-family: 仿宋_GB2312;font-size: 18px;">证明材料包括:</span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;"><span style="font-family:仿宋_GB2312">(</span><span style="font-family:仿宋_GB2312">1)房产证原件和复印件。</span></span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;"><span style="font-family:仿宋_GB2312">(</span><span style="font-family:仿宋_GB2312">2)户口本原件、户口本首页和索引页复印件。</span></span></p><p style="font-size:14px;text-indent: 35px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;">报送材料时要求,将初中学校、准考证号及姓名写在证明材料首页顶端。</span></p><p style="font-size:14px;text-indent: 36px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;">逾期不报送上述材料者,学校将</span><span style="font-family: 仿宋_GB2312;font-size: 18px;">自主</span><span style="font-family: 仿宋_GB2312;font-size: 18px;">进行校区安排。</span></p><p style="font-size:14px;text-indent: 36px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;">3. </span><span style="font-family: 仿宋_GB2312;font-size: 18px;">如果没有房产证,家长可以提交自己认为可以证明住址的材料,但是这些材料不作为主要考虑依据。</span></p><p style="font-size:14px;text-indent: 36px;line-height: 33px;"><span style="font-family: 仿宋_GB2312;font-size: 18px;"><a href="/module/download/downfile.jsp?classid=0&showname=%E5%B1%B1%E4%B8%9C%E7%9C%81%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E6%8C%87%E6%A0%87%E7%94%9F%E5%BD%95%E5%8F%96%E5%85%AC%E7%A4%BA%E5%90%8D%E5%8D%95.pdf&filename=82561f14beb14bc597e03c7feb2fc31a.pdf']
依旧不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:44:46 | 显示全部楼层

我就说,很垃圾吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-24 13:45:20 | 显示全部楼层
陶远航 发表于 2023-7-24 13:41
抱歉听到你的问题还没有完全解决,我会尽力帮助你找到解决方案。

根据你提供的代码和描述,我注意到你遇 ...

我给你的这个网址用你的代码确实可以,但如果再换一个网址:https://www.lcez.cn/news/2023-7-21/3595.html,阁下又该如何应对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:45:22 | 显示全部楼层

你那啥...成功了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:46:05 | 显示全部楼层
感谢提供完整的代码。

根据你提供的代码,你希望从指定网址中提取所有的 PDF 文件的链接。根据我理解,你遇到的问题是在更换网址后,代码无法正确提取出想要的 PDF 链接。

可能的原因是网页结构的变化导致了正则表达式无法正确匹配到 PDF 链接。为了解决这个问题,你可以尝试以下方法:

1. **检查网页结构**:在更换网址后,打开新的网页并检查其 HTML 结构,确保 PDF 链接的  <a>  标签和属性与之前的网页结构一致。

2. **调整正则表达式**:根据新的网页结构,调整正则表达式以正确匹配 PDF 链接。你可以使用在线的正则表达式测试工具(如https://regex101.com/)来调试和测试你的正则表达式。

3. **使用其他解析库**:除了正则表达式,你还可以考虑使用其他的 HTML 解析库,如 BeautifulSoup,来解析网页并提取所需的链接。BeautifulSoup 提供了更简洁、灵活的方法来处理 HTML 结构。

下面是使用 BeautifulSoup 解析网页并提取 PDF 链接的示例代码:
import requestsfrom urllib.parse import urljoinfrom bs4 import BeautifulSoupdef get_pdf_urls(url):    response = requests.get(url)    html_content = response.text    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改    pdf_urls = []    soup = BeautifulSoup(html_content, 'html.parser')    links = soup.find_all('a', href=True)    for link in links:        absolute_url = urljoin(domain, link['href'])        if absolute_url.endswith('.pdf'):            pdf_urls.append(absolute_url)    return pdf_urls# 指定网址进行测试url = "http://sdshiyan.jinan.cn/art/2023/7/14/art_5081_296939.html"pdf_urls = get_pdf_urls(url)print(pdf_urls)
你可以尝试使用 BeautifulSoup 进行解析,并根据新网页的结构调整代码,以正确提取出 PDF 链接。希望这个解决方案能够帮助你解决问题。如果还有其他疑问,请随时提问。求给个最佳答案,非常感谢

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:47:05 | 显示全部楼层
陶远航 发表于 2023-7-24 13:45
你那啥...成功了吗

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

使用道具 举报

 楼主| 发表于 2023-7-24 13:48:13 | 显示全部楼层
学习编程中的Ben 发表于 2023-7-24 13:46
感谢提供完整的代码。

根据你提供的代码,你希望从指定网址中提取所有的 PDF 文件的链接。根据我理解,你 ...

你的代码和3#的一样,是我目前看到最合理的办法。但为什么https://www.lcez.cn/news/2023-7-21/3595.html网址不适用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:49:02 | 显示全部楼层
青出于蓝 发表于 2023-7-24 13:45
我给你的这个网址用你的代码确实可以,但如果再换一个网址:https://www.lcez.cn/news/2023-7-21/3595.ht ...


尝试从Bing那里获取答案:
https://www.bing.com/search?q=Bi ... v=1&FORM=hpcodx(无法访问,推荐插件:无忧行)

把链接以及代码复制给他,让他帮你看看,一定要把运行结果给它,然后一步步让它写出代码。这样Bing就发挥出可以联网的优势了

实在不行:https://c.binjie.fun

记得回来最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:50:10 | 显示全部楼层
青出于蓝 发表于 2023-7-24 13:48
你的代码和3#的一样,是我目前看到最合理的办法。但为什么https://www.lcez.cn/news/2023-7-21/3595.html ...

已转人工回答,等我几分钟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:50:59 | 显示全部楼层
青出于蓝 发表于 2023-7-24 13:48
你的代码和3#的一样,是我目前看到最合理的办法。但为什么https://www.lcez.cn/news/2023-7-21/3595.html ...

你要怕什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:53:31 | 显示全部楼层
稍等,我给你写一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:54:07 | 显示全部楼层
青出于蓝 发表于 2023-7-24 13:48
你的代码和3#的一样,是我目前看到最合理的办法。但为什么https://www.lcez.cn/news/2023-7-21/3595.html ...

那两个PDF?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 14:00:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 学习编程中的Ben 于 2023-7-24 14:13 编辑

你只少加了一个headers和需要更改主域名,
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari'
    }
    response = requests.get(url, headers=headers)
    html_content = response.text

    domain = re.match(r'(https://.*?\..*?\..*?/)', url).group()
    pdf_urls = []
    pattern = r'<a\s.*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "https://www.lcez.cn/news/2023-7-21/3595.html"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 14:01:15 | 显示全部楼层
试试可不可以用@青出于蓝
人工帮你检查的,最佳答案不过分吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 14:06:33 | 显示全部楼层
而且你现在不需要主动更改主域名,他会自动识别匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 09:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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