当前位置: 首页 > 知识库问答 >
问题:

无法刮取带有多个html标记的网页

甄阳朔
2023-03-14

我在stackoverflow进行了彻底的搜索,但没有找到合适的解决方案。我正在清理一个遗留的网站,我想提取所有的标签和输入名称。旧网页的html格式如下所示

<div class="labellong">First Name</div>
<INPUT class="input-l"  name="firstname">

<div class="labellong">Last Name</div>
<INPUT class="input-l"  name="lastname">

<div class="labellong">Gender</div>
<input type="radio" name="gender" value="male"> Male<br>
<input type="radio" name="gender" value="female"> Female<br>

<table>
    <tr valign="top">
        <td width="174">User Name</td>
        <td width="888"><input name="username" value="" id="username" class="input-m" /></td>
    </tr>
    <tr>
        <td width="174">User Account</td>
        <td width="888"><input name="useraccount" value="" id="uaseraccount" class="input-m" /></td>
    </tr>
</table>

我想使用python提取输出,并将beautifulsoup作为

First Name, firstname 
Last Name, lastname 
Gender, gender 
User Name, username 
User Account, useraccount

我确实尝试了findall方法,但失败了,因为我需要标签(文本)和输入标签名称一起,有没有解决方案与标签文本的多个html标签报废?谢谢

我是一个新的网页刮削和这里的代码,我做了尝试

from bs4 import BeautifulSoup
import urllib.request as urllib2

f = open("g:\output.txt", "w")
errFile = open("g:\error.txt", "w")

url = "file:///g://pharmacy.htm"
file = urllib2.urlopen(url)
soup = BeautifulSoup(file)


for message1 in soup.findAll(["div", {"class": "labellong"}, "input", {"class": "input-l"}, "td"]):
    outText = message1.get_text()
    f.write( outText + '\n')


f.close()
errFile.close()

共有1个答案

徐帅
2023-03-14

我会尝试的解决方案是选择同级https://www.crummy.com/software/beautifulsoup/bs4/doc/#next-sibling-and-previous-sibling

所以首先找到标签,然后用每个标签找到兄弟

编辑

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("/Projects/python/webscraping/web.html"),"html5lib")

for div in soup.findAll(["div", {"class": "labellong"}]):
    labelName = div.get_text()
    for sibling in div.next_siblings:
        if (sibling.name == "input"):
            inputName = sibling['name']
            break
    print labelName, inputName

for row in soup.findAll(["tr"]):
    labelName = None
    inputName = None
    for td in row:
        if (td.name == 'td'):
            if (not labelName): # labelName not yet set
                labelName = td.get_text()
            else: # second td so inputName
                inputName = td.contents[0]['name']
                print labelName, inputName
 类似资料:
  • 在我使用Jsoup连接到Instagram页面后,我想从一个标记中提取整个外部html。不知怎的,当我检查页面并从标记中复制外部html时,我得到了大量的行,而我使用Jsoup只得到了很少的行(不知怎的,嵌套标记的html被忽略了)任何帮助都将感谢如何获得整个html! 代码: 输出: 编辑:我希望保存span标记的整个HTML(我希望HTMLUnit/JSOUP的结果与我右键单击标记时的结果相同

  • 我需要从下面的链接刮表。 我使用selenium编写了一个脚本,可以单击下一个页面,但每个页面中的表似乎没有标记。相反,它似乎只包含标记。我发现很难在这个网站上找到桌子。任何帮助都是非常贴切的。 编辑%1 提前道谢。

  • 问题内容: 我目前正在开发一个Ionic Framework(AngularJS)项目,该项目使用地理位置和Google Maps显示用户的位置。 我正在尝试向用户显示地理位置以及该区域周围的多个标记。 我的地理位置已正常运行,但似乎无法添加多个标记。 地点 控制器 问题答案:

  • 我想在每个文本之后使用jsoup提取一个文本。有没有办法选择它? 示例代码如下: 当它完成时,它会创建自动id示例id=123

  • 我是编程新手,我正试图建立一个网站。 该网站是一个在线赌场(https://www.888casino.it/live-casino/#filters=all-轮盘赌),我只需要刮取其中一个显示的数字(特定位置中包含的数字大约每30秒改变一次,但我稍后会考虑这个问题)。 我要刮取的数字包含在span标记中,我无法找到它,因为它们没有id或类。因此,我考虑定位包含span标记的div标记,然后使用函

  • 我很高兴过去几天一直在学习python。今天我要讲一个叫做网络抓取的话题。我试图刮除div中的所有p标签,除了前3个p标签。因为p标记没有类或id,所以我找不到方法取消它们 我的代码: 我的输出: 虚拟文本 不需要的文本 没有文本 Lorem ipsum dolor sit amet 临时工程量清单 献祭精英 我们的劳动和医疗保险公司 我需要的是: Lorem ipsum dolor sit am